软件工程概述及设计模式.ppt_第1页
软件工程概述及设计模式.ppt_第2页
软件工程概述及设计模式.ppt_第3页
软件工程概述及设计模式.ppt_第4页
软件工程概述及设计模式.ppt_第5页
已阅读5页,还剩107页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录 1OO概述 面向对象分析 OOA 做什么 从问题域中获取需要的类和对象 以及它们之间的关系 面向对象设计 OOD 怎么做 面向对象编程 OOP Doit 1OO概述 老张开车去东北 请用OO思想进行分析 OOA 和设计 OOD 体现OO三大特性封装类 名词 1OO概述 老张开车去东北 请用OO思想进行分析 OOA 和设计 OOD 封装类 名词 1OO概述 老张开车去东北 封装创建成员方法 1OO概述 老张开车去东北 获取属性 完善成员方法 1OO概述 老张开车去东北 封装 作用 隐藏信息 降低类间耦合性 1OO概述 老张开车去东北 初始设计 1OO概述 publicclassDriver privateStringdriverName publicStringgetName returndriverName publicvoiddrive Carcar car go newAddress 东北 1OO概述 publicclassCar publicvoidgo Addressdest System out println 一路哼着歌 冒着烟 去了 dest getName 1OO概述 publicclassAddress privateStringaddressName publicStringgetName returnaddressName publicvoidsetName Stringname addressName name 1OO概述 老张开车去东北 设计优化 继承和多态在某个粒度视图层面上对同类事物不加区别的对待而统一处理 1OO概述 publicclassDriver privateStringdriverName publicStringgetName returndriverName publicvoidsetName Stringname driverName name Viheclevihecle newCar publicvoiddrive Viheclevihecle vihecle go newAddress 东北 1OO概述 publicabstractclassVihecle publicabstractvoidgo Addressdest publicclassCarextendsVihecle publicvoidgo Addressdest System out println 一路哼着歌 冒着烟 去了 dest getName publicclassPlaneextendsVihecle publicvoidgo Addressdest System out println 一路驾着云彩去了 dest getName 1OO概述 publicclassAddress privateStringaddressName publicAddress Stringname addressName name publicStringgetName returnaddressName publicvoidsetName Stringname addressName name 1OO概述 publicclassClient publicstaticvoidmain String args Driverd newDriver d setName 老张 d drive newPlane d drive newCar 有什么缺陷 1OO概述 持续优化 添加而不修改 系统扩展性强 重载 2面向接口编程 面试题 1 抽象类可以有构造方法 接口不可以 2 抽象类中可以有普通成员变量 普通方法 接口不可以 3 抽象类中的抽象方法的访问类型不能是private访问类型 但接口的抽象方法只能是public 4 抽象类可以包含静态方法 但接口不可以 5 抽象类中静态成员变量的访问类型可以任意 但接口只能是Public static final类型 6 一个类可以实现多个接口 但只能继承一个抽象类 1abstractclass和interface有什么区别 2面向接口编程 设计层面 抽象类是某种抽象事物 isa 接口是一组行为规范 likea 接口体现了 如果你是 则必须能 的理念语法层面 抽象类体现单继承关系 接口可实现多继承 2面向接口编程 2面向接口编程 面试题 扩展题 2 1接口是否可以继承接口 2 2接口是否可以继承抽象类 2 3抽象类是否可以实现接口 2 4抽象类是否可以继承具体类 2 5抽象类中是否可以有静态的main方法 抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstrct方法 2面向接口编程 面向接口编程 在系统分析和架构中 分清层次和依赖关系 下层不是直接向其上层提供服务 即不是直接实例化在上层中 而是通过定义一组接口 仅向上层暴露其接口功能 上层对于下层仅仅是接口依赖 而不依赖具体类 系统层次间协作关系是系统设计的关键 小到不同类之间的通信 大到各模块之间的交互 本质 面向抽象编程 定义与实现的分离 2 1 1设计模式四人帮 GoF 四人帮 又称GangofFour 即ErichGamma RichardHelm RalphJohnson JohnVlissides四人 的 设计模式 原名 DesignPatterns ElementsofReusableObject OrientedSoftware 第一次将设计模式提升到理论高度 并将之规范化 该书提出了23种基本设计模式 3 8六大原则总览 3 1单一职责原则 SRP 单一职责原则 SingleResponsibilityPrinciple 定义 应该有且仅有一个原因引起类的变更 通俗言之 一个类只负责一个职责 单一职责原则 实现高内聚 低耦合的指导方针 问题由来 类T负责两个不同的职责 职责P1 职责P2 则职责P1需求发生改变而需要修改类T时 有可能会导致原本运行正常的职责P2功能发生故障 总结 接口一定要做到单一职责 类的设计尽量做到一个原因引起变化就行 3 2接口隔离原则 ISP 接口隔离原则 InterfaceSegregationPrinciple 定义 1 客户端不应该依赖它不需要的接口 2 类间的依赖关系应该建立在最小的接口上 通俗言之 不要建立臃肿庞大的接口 与单一原则的区别单一职责要求的是类和接口单一 注重的是职责 这是业务逻辑上的划分 而接口隔离原则要求接口的方法尽量少 3 2接口隔离原则 ISP Eg 设计门的类abstractDoor abstractvoidOpen abstractvoidClose 3 2接口隔离原则 ISP 新需求 需要门具有报警功能 解决方案一 在抽象类 或接口 Door添加alarm方法 abstractDoor abstractvoidOpen abstractvoidClose abstractvoidAlarm 3 2接口隔离原则 ISP 问题 违背ISP 接口隔离原则 Alarm方法对于依赖Door的模块是多余的 修改方案 abstactDoor保留Open Close Alarm由子类扩展 拆分成interfaceDoor和interfaceAlarm接口 拆分成abstactDoor和interfaceAlarm 3 2接口隔离原则 ISP abstractDoor abstractvoidOpen abstractvoidClose InterfaceAlarmable voidAlarm classAlarmDoorextendsDoorimplentsAlarmable 3 3里氏替换原则 LSP 里氏替换原则 LiskovSubstitutionPrinciple 定义 所有引用基类的地方必须能透明地使用其子类的对象 通俗言之 任何父类出现的地方 子类一定可以出现 在程序中尽量使用基类类型来对对象进行定义 而在运行时再确定其子类类型 用子类对象来替换父类对象 总结 子类可以扩展父类的功能 但不能改变父类原有的功能 3 4依赖倒置原则 DIP 依赖倒置原则 DependenceInversionPrinciple 定义 1 高层模块不应该依赖低层模块 两者都应该依赖于抽象 抽象类或接口 2 抽象 抽象类或接口 不应该依赖于细节 具体实现类 3 细节 具体实现类 应该依赖抽象 通俗言之 依赖抽象 不依赖实现 总结 面向接口编程 3 5开闭原则 OCP 开闭原则 OpenClosePrinciple 定义 一个软件实体如类 模块和函数 应该对扩展开放 对修改关闭 通俗言之 一个好的系统是在不修改已有源代码的情况下 可以扩展功能 实现开闭原则的关键就是抽象化 3 5开闭原则 OCP 在 开 闭 原则中 不允许修改的是抽象的类或者接口 允许扩展的是具体的实现类 抽象类和接口在 开 闭 原则中扮演着极其重要的角色 模板方法模式和观察者模式都是开闭原则的极好体现 3 6合成复用原则 CRP 合成复用原则 CompositeReusePrinciple CARP 要优先使用对象组合 聚合 通俗言之 要尽量使用合成 聚合 尽量不要使用继承 继承复用 从基类继承而来的实现是静态的 不可能在运行时发生改变 没有足够的灵活性 破坏封装性 把父类实现细节直接暴露给子类 白箱复用 父类发生改变 子类也应改变 类与类之间高耦合 3 6合成复用原则 CRP 组合 聚合复用 耦合度相对较低 可以在运行时动态进行 黑箱复用 如果两个类之间是 Has A 的关系应使用组合或聚合 如果是 Is A 关系可使用继承 桥接模式遵循该原则 3 6合成复用原则 CRP 3 6合成复用原则 CRP 3 7迪米特原则 LOD 迪米特原则 LawOfDemeter 定义 指一个对象应该对于其他对象有最少的了解 问题由来 类与类之间的关系越密切 耦合度越大 当一个类发生改变时 对另一个类的影响也越大 通俗言之 不要跟陌生人说话 类应该对自己需要耦合或调用的类知道得越少越好 2 1 2设计模式概述 设计模式 Designpattern 是一套被反复使用 多数人知晓的 经过分类编目的 代码设计经验的总结 为何提倡设计模式 根本原因是为了代码复用 增加可维护性 设计模式有助于对框架结构的理解 成熟的框架通常使用了多种设计模式 设计模式通过实现面向对象六大原则 从而达到了代码复用 增加可维护性的目的 2 2 1设计模式基本元素 模式名称问题解决方案效果 2 2 2设计模式分类 设计模式分为三种类型 共23类 创建型模式 单例模式 抽象工厂模式 建造者模式 工厂模式 原型模式 结构型模式 适配器模式 桥接模式 装饰模式 组合模式 外观模式 享元模式 代理模式 行为型模式 模版方法模式 命令模式 迭代器模式 观察者模式 中介者模式 备忘录模式 解释器模式 状态模式 策略模式 职责链模式 访问者模式 2 3 1设计模式之单例模式 Singleton 单例设计模式的特点 1 单例设计模式保证一个类只有一个实例 2 要提供一个访问该类对象实例的全局访问点 单例模式最重要的就是要保证一个类只有一个实例并且这个类易于被访问 一个全局类使得一个对象可以被访问 但是这样做却不能防止你实例化多个对象 2 3 1设计模式之单例模式 Singleton 单例设计模式的实现 1 为了避免其它程序过多的建立该类的对象 先禁止其它程序建立该类对象实例 将构造器私有化 2 为了方便其它程序访问该类的对象 只好在本类中自定义一个对象 由1可知该对象是static的 并对外提供访问方式 2 3 1设计模式之单例模式 Singleton 单例模式具体实现有两种 懒汉式classSingleton privatestaticSingletoninstance null privateSingleton publicstaticSingletongetInstance if instance null instance newSingleton returninstance 2 3 1设计模式之单例模式 Singleton 饿汉式classSingleton privatestaticSingletoninstance newSingleton privateSingleton publicstaticSingletongetInstance returninstance 2 3 1设计模式之单例模式 Singleton 饿汉式 总结 对象预先加载 线程是安全的 在类创建好的同时对象生成 调用获得对象实例的方法反应速度快 代码简练 懒汉式 总结 对象延迟加载 效率高 只有在使用的时候才实例化对象 若设计不当线程会不安全 代码相对于饿汉式复杂 第一次加载类对象的时候反应不快 2 3 1设计模式之多例模式 MultitonPattern classMultiton privatestaticMultitonmulti1 newMultiton privatestaticMultitonmulti2 newMultiton privateSingleton publicstaticSingletongetInstance intvalue if 1 value returnmulti1 else returnmulti2 多例模式 单例模式的推广 2 3 1设计模式之多例模式 MultitonPattern classMultiton privatestaticListlist newArraryList privatestaticMultitonmulti1 newMultiton privatestaticMultitonmulti2 newMultiton privatestaticfinalintmaxCount 2 最多的实例数static list add multi1 list add multi2 privateSingleton publicstaticSingletongetInstance intvalue returnlist get index 多例模式 单例模式的推广 2 3 2工厂模式 Factory 工厂模式在 java与模式 中分为三类 简单工厂模式 静态工厂SimpleFactory 工厂方法模式 FactoryMethod 抽象工厂模式 AbstractFactory GOF在 设计模式 一书中 将简单工厂模式看做特殊的工厂方法模式 2 3 2工厂模式 Factory 简单工厂模式 静态工厂SimpleFactory Creater 工厂角色 是简单工厂的核心 工厂角色可被外部直接调用 创建所需产品对象 Product 抽象产品角色 具体产品类的父类 ConcreteProduct 具体产品类 2 3 2工厂模式 Factory publicclassCreater 静态工厂模式publicstaticDogCreateDog StringdogName throwsException if carName equalsIgnoreCase TaiDi returnnewTaiDi elseif carName equalsIgnoreCase MuYang returnnewMuYang publicabstractDog publicvoidrun 2 3 2工厂模式 Factory publicTaidiextendsDog publicMuYangextendsDog 2 3 2工厂模式 Factory publicclassClient publicstaticvoidmain String args Dogdog newTaiDi Dogdog newMuYang Dogdog Creater CreateDog TaiDi 2 3 2工厂模式 Factory 静态工厂在创建产品时 通常结合反射一起使用 publicclassCreater 静态工厂模式publicstaticTaiDiCreateDog StringcarName throwsException TaiDitaidiDog TaiDi Class forName zhong xxx carName newInstance returntaidiDog 问题简单工厂为什么要用静态方法实现 静态方法的继承问题 缺点 对于新产品的加入创建 无能为力 违背开闭原则 2 3 2工厂模式 Factory 工厂方法模式 FactoryMethod 简单工厂模式对增加新产品 无能为力 不符合开闭原则 对扩展开发 对修改封闭 工厂方法模式是对简单工厂模式的抽象 2 3 2工厂模式 Factory publicabstractclassFactory DoggetInstance publicclassTaiDiFactoryimplementsFactory publicDoggetInstance returnnewTaiDi publicclassMuYangFactoryimplementsFactory publicDoggetInstance returnnewMuYang Creater ConcreteCreater ConcreteCreater 2 3 2工厂模式 Factory publicabstractclassDog publicabstractvoidrun publicclassTaiDiextendsDog publicclassMuYangextendsDog publicvoidrun publicvoiddoAfraid System out println 我是MuYang我怕谁 Product ConcreteProduct ConcreteProduct 2 3 2工厂模式 Factory publicstaticvoidmain String args Factoryfactory newTaiDiFatory Dogdog factory getInstance dog run dog doAfraid 哪些情况使用工厂模式 1 当客户程序不需要知道要使用对象的创建过程 2 客户程序使用的对象存在变动的可能 或者根本就不知道使用哪一个具体的对象 2 3 3抽象工厂模式 AbstractFactory 提供一个创建一系列相关或相互依赖对象的接口 而无需指定它们具体的类 2 3 3抽象工厂模式 AbstractFactory 1 AbstractFactory声明一个创建抽象产品对象的操作接口 2 ConcreteFactory实现创建具体产品对象的操作 3 AbstractProduct为一类产品对象声明一个接口 4 ConcreteProduct定义一个将被相应的具体工厂创建的产品对象 实现AbstractProduct接口 5 Client仅使用由AbstractFactory和AbstractProduct类声明的接口 2 3 3抽象工厂模式 AbstractFactory AbstractFactory publicinterfaceAbstractFactory publicCarCreateBmwCar publicCarCreateBenzCar 2 3 3抽象工厂模式 AbstractFactory ConcreteFactory classConcreteSportFactoryimplentsAbstractFactory publicCarCreateSportBmwCar returnnewBmwSportsCar publicISportingCreateSportBenzCar returnnewBenzSportsCar 2 3 3抽象工厂模式 AbstractFactory AbstractProduct publicabstractCar voidgo 2 3 3抽象工厂模式 AbstractFactory ConcretePorduct publicclassBmwSportsCarextendCar publicvoidgo System out println BmwSportsCarrun publicclassBenzSportsCarextendCar publicvoidgo System out println BenzSportsCarrun 2 3 3抽象工厂模式 AbstractFactory Client publicstaticvoidmain String args AbstractFactorysportCarFactory newConcreteSportFactory Carcar sportCarFactory CreateSportBmwCar Carcar sportCarFactory CreateSportBenzCar 能不能把增加产品家族数量 2 3 4外观模式 Facade Facade模式 2 3 4外观模式 Facade Facade模式 1定义了一个更高的接口 使子系统更加容易使用 2为子系统中的一组接口提供一个统一的接口 2 3 4外观模式 Facade Eg 开关电脑模拟程序 见开关电脑模拟程序文档 2 3 4外观模式 Facade 核心思想 封装交互 简化调用 化繁为简 作用 外部减少与子系统内多个模块的交互 松散耦合 让外部能够更简单的使用子系统 大大节省学习时间 2 3 5适配器模式 Adapter Adapter模式 结构型 1将一个类的接口转换成客户希望的另外一个接口 2使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 Eg1 电源适配器 2 3 5适配器模式 Adapter Eg2 androidemail显示一个ListView的使用涉及了两个部分 一个是数据源DataSource 另外一个是数据源的各项的布局显示ItemLayout DataSource是不能直接展示在用户面前 ItemLayout才是直接用户 DataSource向ItemLayout填充和转换就是一个典型的适配过程 就需要一个适配器对象来参与其中 2 3 5适配器模式 Adapter 示例程序 见Adapter 获取电压程序 2 3 5适配器模式 Adapter Adapter模式 结构型 它不是为了解决还处在开发阶段的问题 而是解决正在服役的项目问题 解决接口不相容的问题 复用代码 不修改原有代码 缺点 对于对象适配器来说 更换适配器的实现过程比较复杂 对象适配器和类适配器 2 3 6职责链模式 COR 职责链 ChainofResponsibility 行为型发送方发送一个请求 使多个对象都有机会处理请求 从而避免请求的发送者和接收者之间的耦合关系 将这些对象连成一条链 并沿着这条链传递该请求 直到有一个对象处理它为止 核心思想 给多个对象处理一个请求的机会 从而解耦发送者和接受者 2 3 6职责链模式 COR 适用范围1有多个对象可以处理同一个请求2不能明确指定接收者 2 3 6职责链模式 COR Eg1 公司请假Eg2 brew平台消息机制Eg3 java异常处理 try catch Exceptione1 catch Exceptione2 finally 2 3 6职责链模式 COR 2 3 7观察者模式 Observer 观察者模式 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新 观察者中涉及了两个对象 一个是观察目标 一个是观察者 观察目标有典型的3个方法 订阅 取消订阅 通知 订阅 增加状态或事件通知的对象取消订阅 删除状态或事件通知对象通知 通知所有订阅了状态和事件的对象 2 3 7观察者模式 Observer Eg 杂志订阅 杂志是主题 观察者是订阅者 当出版新杂志时候 这个事件会自动通知所有的订阅者 Eg 猫和老鼠 2 3 7观察者模式 Observer 观察者模式 定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新 观察者中涉及了两个对象 一个是观察目标 一个是观察者 观察目标有典型的3个方法 订阅 取消订阅 通知 订阅 增加状态或事件通知的对象取消订阅 删除状态或事件通知对象通知 通知所有订阅了状态和事件的对象 2 3 8中介者模式 Mediator 中介者模式 1用一个中介对象来封装一系列的对象交互 2中介者使各对象不需要显式地相互引用 从而使其耦合松散 而且可以独立地改变它们之间的交互 Eg android Activity与IntentDemo程序 Mediator模式 居委会大妈 2 3 8中介者模式 Mediator 2 3 8中介者模式 Mediator 2 3 8中介者模式 Mediator 中介者模式本质 封装交互何时选用中介者模式1如果一组对象之间的通信方式比较复杂 导致相互依赖 结构混乱 2如果一个对象引用很多的对象 并直接跟这些对象交互 导致难以复用该对象 2 3 9模式区别 外观模式和中介者模式1中介者模式主要用来封装多个对象之间相互的交互 多用在系统内部的多个模块之间 而外观模式封装的是单向的交互 2在中介者模式的实现里面 是需要实现具体的交互功能的 而外观模式的实现里面 一般是组合调用或是转调内部实现的功能 通常外观模式本身并不实现这些功能 2 3 9模式区别 外观模式和单例模式通常一个子系统只需要一个外观实例 所以外观模式可以和单例模式组合使用 把Facade类实现成为单例 2 3 9模式区别 外观模式和抽象工厂模式外观模式的外观类通常需要和系统内部的多个模块交互 每个模块一般都有自己的接口 所以在外观类的具体实现里面 需要获取这些接口 然后组合这些接口来完成客户端的功能 那么怎么获取这些接口呢 就可以和抽象工厂一起使用 外观类通过抽象工厂来获取所需要的接口 而抽象工厂也可以把模块内部的实现对Facade进行屏蔽 也就是说Facade也仅仅只是知道它从模块中获取的它需要的功能 模块内部的细节Facade也不知道了 2 3 10状态模式 状态模式允许一个对象在其内部状态改变的时候改变其行为 这个对象看上去就像是改变了它的类一样 状态模式把所研究的对象的行为包装在不同的状态对象里 每一个状态对象都属于一个抽象状态类的一个子类 状态模式的意图是让一个对象在其内部状态改变的时候 其行为也随之改变 2 3 10状态模式 天气案例 疯狂设计模式 2 3 11桥接模式 桥接模式 将抽象部分与它的实现部分分离 使它们都可以独立地变化 应用场景 某个类具有两个或两个以上的维度变化 如果只是使用继承将无法实现这种需要 或者使得设计变得相当臃肿 2 3 11桥接模式 2 3 11桥接模式 举例来说 面馆供应牛肉面 猪肉面 而且顾客可根据自己的口味选择是否添加辣椒 此时就产生了一个问题 我们如何来应对这种变化 我们是否需要定义辣椒牛肉面 无辣牛肉面 辣椒猪肉面 无辣猪肉面4个子类 如果餐厅还供应羊

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论