设计模式复习2010级._第1页
设计模式复习2010级._第2页
设计模式复习2010级._第3页
设计模式复习2010级._第4页
设计模式复习2010级._第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

1、LOGO设计模式设计模式(Design Pattern) 张凯 副教授计算机学院 软件工程系武汉科技大学主要内容主要内容面向对象的七大设计原则1设计模式类型2类与类之间的六大关系323个设计模式4武汉科技大学设计设计模式模式定义定义v设计模式的定义 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。武汉科技大学设计设计模式模式定义定义v设计模式的基本要素 设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以

2、下四个方面: 模式名称 (Pattern name) 问题 (Problem) 解决方案 (Solution) 效果 (Consequences) 通过一两个词来为模式命名,以便我们更好地理解模式,并方便开发人员之间的交流,通常模式都是根据其功能或结构命名。描述了应该在何时使用模式,它包含了设计中存在的问题以及问题存在的原因。描述了一个设计模式的组成部分,以及这些组成部分之间的相互关系,各自的职责和协作方式,通通常解决方案通过常解决方案通过UML类图和核心类图和核心代码进行描述。代码进行描述。描述了模式的优缺点以及在使用模式时应权衡的问题。武汉科技大学面向对象面向对象的七大的七大设计原则设计原

3、则v1.开放封闭原则OCPv2.单一职责SRPv3.里氏代换LSPv4.依赖倒转DIPv5.迪米特法则LODv6.接口隔离ISPv7.合成聚合复用原则CARP武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v开放封闭原则OCP 开放封闭原则(Open-Closed Principle,OCP)是面向对象的可复用设计(Object Oriented Design或OOD)的基石。其他设计原则(里氏代换原则、依赖倒转原则、合成/聚合复用原则、迪米特法则、接口隔离原则)是实现开放封闭原则的手段和工具。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v开放封闭原则OCP 定义:一个软件

4、实体应当对扩展开放,对修改关闭。即在设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v开放封闭原则OCP 满足开放封闭原则的系统的优点 a)通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软 件系统有一定的适应性和灵活性。 b)已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有 一定的稳定性和延续性。 c)这样的系统同时满足了可复用性与可维护性。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v开放封闭原则OCP 如何实现开放封闭原则 解决问题关键在于抽象化,抽象

5、化是面向对象设计的第一个核心本质。 在面向对象编程中,通过抽象类及接口,规定了具体类的特征作为抽象层,相对稳定,不需更改,从而满足“对修改关闭”;而从抽象类导出的具体类可以改变系统的行为,从而满足“对扩展开放”。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v单一职责原则SRP 单一职责原则(Single Responsibility Principle,SRP):一个类,最好只做一件事,只有一个引起它变化的原因。 一个优良的系统设计,强调模块间保持低耦合、高内聚的关系。单一职责,强调的是职责的分离。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v单一职责原则SRP 为什么

6、要把这两个职责分离到单独的类中呢? 如果一个类承担的职责过多,等于把这些职责耦合在了一起。一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破坏。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v里氏代换原则LSP 里氏代换原则(Liskov Substitution Principle, LSP):在一个软件系统中,子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v里氏代换原则LSP 一个软件实体如果使用的是一个基类的话,那么一定适

7、用于其子类。而且它觉察不出基类对象和子类对象的区别。也就是说,在软件里面,把基类都替换成它的子类,程序的行为没有变化。 反过来的代换不成立,如果一个软件实体使用的是一个子类的话,那么它不一定适用于基类。 任何基类可以出现的地方,子类一定可以出现。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v依赖倒转原则DIP 依赖倒转原则(dependence inversion principle, DIP): 1高层模块不应该依赖于低层模块,二者都应该依赖于抽象。 2抽象不应该依赖于细节,细节应该依赖于抽象,要针对接口编程,不要针对实现编程。 也就是说应当使用接口和抽象类进行变量类型声明、参数

8、类型声明、方法返回类型说明,以及数据类型的转换等。而不要用具体类。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v依赖倒转原则DIP武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v依赖倒转原则DIP武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v依赖倒转原则DIP 工厂方法模式 模版方法模式 迭代器模式武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v迪米特法则LoD 迪米特法则(Law of Demeter,LoD):又叫做最少知识原则。就是说,一个对象应当对其他对象有尽可能少的了解。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v迪米特法则L

9、oD (1)只与你直接的朋友们通信 (2)不要跟陌生人说话 (3)每一个软件单位对其他的单位都只有最少的知识,而且局限于那些本单位密切相关的软件单位。 就是说,如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中的一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v迪米特法则LoD 这样,当一个模块修改时,就会尽量少的影响其他的模块。扩展会相对容易。 门面(外观)模式和中介者模式实际上就是迪米特法则的具体应用。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v合成聚合复用原则CARP 合

10、成聚合复用原则(Composite/Aggregate Reuse Principle,CARP):在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到复用这些对象的目的。应首先使用合成/聚合,合成/聚合则使系统灵活,其次才考虑继承,达到复用的目的。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v合成聚合复用原则CARP 优先使用对象合成/聚合(UML中的两个菱形关系),而不是类继承。尽量使用合成/聚合,不使用类继承,继承属于强耦合的结构。 合成聚合复用好处:优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类

11、继承层次会保持较小规模,并且不太可能增长为不可控制的庞然大物。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v合成聚合复用原则CARP 将抽象部分与它的实现部分分离,使他们都可以独立地变化。 桥接模式就是把抽象和实现独立出来,让它们各自变化。这就使得每种实现的变化不会影响其他实现,从而达到应对变化的目的。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP 接口隔离原则(interface separate principle,ISP):接口隔离原则:使用多个专门的接口比使用单一的总接口要好。也就是说,一个类对另外一个类的依赖性应当是建立在最小的接口上。 武汉

12、科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP 接口往往有两种不同的含义:一种是指一个类型所具有的方法特征的集合,仅仅是一种逻辑上的抽象; 另外一种是指某种语言具体的接口定义,有严格的定义和结构。比如c# 语言里面的Interface结构。对于这两种不同的含义,ISP的表达方式以及含义都有所不同。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP 当我们把接口理解成一个类所提供的所有方法的特征集合的时候,这就是一种逻辑上的概念。接口的划分就直接带来类型的划分。这里,我们可以把接口理解成角色,一个接口就只是代表一个角色,每个角色都有它特定的一个

13、接口,这里的这个原则可 以叫做角色隔离原则。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP 如果把接口理解成狭义的特定语言的接口,那么ISP表达的意思是说,对不同的客户端,同一个角色提供宽窄不同的接口,也就是定制服务,个性化服务。就是仅仅提供客户端需要的行为,客户端不需要的行为则隐藏起来。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP 应当为客户端提供尽可能小的单独的接口,而不要提供大的总接口。 这也是对软件实体之间通信的限制。但它限制的只是通信的宽度,就是说

14、通信要尽可能的窄。武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP武汉科技大学面向对象面向对象的七大的七大设计原则设计原则v接口隔离原则ISP武汉科技大学设计模式设计模式分类分类v设计模式的分类 根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural)和行为型(Behavioral)三种: 创建型模式主要用于创建对象。 结构型模式主要用于处理类或对象的组合。 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。武汉科技大学设计模式设计模式分类分类v创建型模式 抽象工厂模式(Abstract Factory) 建造者模式

15、(Builder) 工厂方法模式(Factory Method) 原型模式(Prototype) 单例模式(Singleton) 武汉科技大学设计模式设计模式分类分类v结构型模式 适配器模式(Adapter) 桥接模式(Bridge) 组合模式(Composite) 装饰模式(Decorator) 外观模式(Facade) 享元模式(Flyweight) 代理模式(Proxy)Attack?要我干啥嘛?要我干啥嘛?武汉科技大学设计模式设计模式分类分类v行为型模式 职责链模式(Chain of Responsibility) 命令模式(Command) 迭代器模式(Iterator) 中介者模式

16、(Mediator) 备忘录模式(Memento) 观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor) 解释器模式(Interpreter)武汉科技大学类图类图vUML六大关系 关联关系(Association) 聚合关系(Aggregation) 组合关系(Composition) 依赖关系(Dependency) 实现(Realization) 泛化(Generalization)武汉科技大学类图类图v关联关系(Association) 关联关系是类与类之间最常用的一种关系,它是

17、一种结构化关系,用于表示一类对象与另一类对象之间有联系。 在UML类图中,用实线连接有关联的对象所对应的类,在使用C#、C+和Java等编程语言实现关联关系时,通常将一个类的对象作为另一个类的属性。武汉科技大学v关联关系(Association)类图类图 Person类与Bicycle类之间存在关联关系,这意味着在Person类中需要定义一个Bicycle类型的成员变量。武汉科技大学类图类图public class Person private Bicycle bicycle; /* 骑自行车去上班 */ public void goToWork() bicycle.run(); 武汉科技大学

18、类图类图v聚合关系(Aggregation) 聚合关系表示一个整体与部分的关系。通常在定义一个整体类后,再去分析这个整体类的组成结构,从而找出一些成员类,该整体类和成员类之间就形成了聚合关系。 在聚合关系中,成员类是整体类的一部分,即成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在UML中,聚合关系用带空心菱形的直线表示。 武汉科技大学类图类图v聚合关系(Aggregation)武汉科技大学类图类图public class ProjectGroup private Student student; /开始做项目 public void Work() student.star

19、tWorking(); 武汉科技大学类图类图v组合关系(Composition) 组合关系也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。 在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。在UML中,组合关系用带实心菱形的直线表示。武汉科技大学类图类图v组合关系(Composition)武汉科技大学类图类图public class Person private Brain brain; public Person() brain = n

20、ew Brain(); 武汉科技大学类图类图v依赖关系(Dependency) 依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。 在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。武汉科技大学类图类图v依赖关系(Dependency)武汉科技大学类图类图public class Bicycle public void Run /* 给轮胎充气 */ public void expand(Pump pump) pump.blow();

21、武汉科技大学类图类图v泛化关系(Generalization) 泛化关系也就是继承关系,也称为“is-a”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。在UML中,泛化关系用带空心三角形的直线来表示。 在代码实现时,使用面向对象的继承机制来实现泛化关系,如在Java语言中使用extends关键字、在C+ 、C#中使用冒号“:”来实现。 武汉科技大学v泛化关系(Generalization)类图类图武汉科技大学类图类图 public class Person protected string name; protected int age; public v

22、oid move() public void say() public class Student : Person private string studentNo; public void study() 武汉科技大学类图类图v实现关系(Realization) 接口之间也可以有与类之间关系类似的继承关系和依赖关系,但是接口和类之间还存在一种实现关系,在这种关系中,类实现了接口,类中的操作实现了接口中所声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。 武汉科技大学v实现关系(Realization)类图类图武汉科技大学类图类图 public interface V

23、ehicle public void move(); public class Ship : Vehicle public void move() Console.WriteLine(轮船航行); public class Car : Vehicle public void move() Console.WriteLine(汽车行驶); 武汉科技大学单例模式单例模式(Singleton)(Singleton)v模式结构 构造函数私有构造函数私有自行创建单个实例自行创建单个实例自行向整个系统提供唯一实例自行向整个系统提供唯一实例保证一个类仅有一个实例,并提供一个访问它的全局访问点。武汉科技大学简

24、单工厂模式简单工厂模式(Simple Factory)(Simple Factory)v模式结构 武汉科技大学简单工厂模式简单工厂模式(Simple Factory)(Simple Factory)v模式结构 武汉科技大学简单工厂模式简单工厂模式(Simple Factory)(Simple Factory)用户要求:添加一个新运算用户要求:添加一个新运算武汉科技大学工厂方法模式工厂方法模式(Factory Method)(Factory Method)定义一个用于创建对象的接口,让子类决定实例化哪一个类。该模式使一个类的实例化延迟到其子类。武汉科技大学抽象工厂模式抽象工厂模式(Abstrac

25、t Factory(Abstract Factory) )提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。武汉科技大学原型模式原型模式(Prototype)(Prototype)v模式结构 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。武汉科技大学原型模式原型模式(Prototype)(Prototype)武汉科技大学建造者模式建造者模式(Builder Pattern)(Builder Pattern)v模式结构 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。武汉科技大学适配器模式适配器模式(Adapter)(Adapter)

26、v模式结构 将一个类的接口转换成客户希望的另外一个接口。本模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。武汉科技大学适配器模式适配器模式(Adapter)(Adapter)v类适配器和对象适配器假设我们在软件开发中要记录日志,包括数据库记录日志DatabaseLog和文本文件记录日志WriteLog武汉科技大学适配器模式适配器模式(Adapter)(Adapter)v类适配器和对象适配器开发过程需要引入一个新的日志接口,但新的日志接口和以前的不一样武汉科技大学适配器模式适配器模式(Adapter)(Adapter)v类适配器武汉科技大学适配器模式适配器模式(Adapter)(A

27、dapter)v类适配器 public class DatabaseLogAdapter : DatabaseLog, Ilog public void Write() this.WirteLog(); public class FileLogAdapter : FileLog, Ilog public void Write() this.WirteLog(); 武汉科技大学适配器模式适配器模式(Adapter)(Adapter)v对象适配器武汉科技大学适配器模式适配器模式(Adapter)(Adapter)v对象适配器 public class LogAdapter : Ilog priva

28、te Log log; public LogAdapter(Log log) this.log = log; public void Write() log.WriteLog(); 武汉科技大学适配器模式适配器模式(Adapter)(Adapter)上面两种适配方式,可以看出在类适配方式中,是通过类的继承来实现的,同时也具有接口ILog的所有行为,这些就违背了面向对象设计原则中的类的单一职责原则,而对象适配器则是通过对象组合的方式来实现的,则符合面向对象的精神,所以推荐用对象适配的模式。武汉科技大学桥接模式桥接模式(Bridge)(Bridge)v模式结构 武汉科技大学桥接模式桥接模式(Bri

29、dge)(Bridge)v模式结构 将抽象部分与它的实现部分分离,使它们都可以独立地变化。武汉科技大学组合模式组合模式 (Composite Pattern)(Composite Pattern)v模式结构 将对象组合成树形结构以表示“部分-整体”的层次结构。武汉科技大学装饰装饰模式模式( (Decorator Pattern)Decorator Pattern)v模式结构 动态地给一个对象添加一些额外的职责。武汉科技大学享元模式享元模式(Flyweight)(Flyweight)v模式结构 武汉科技大学享元模式享元模式(Flyweight)(Flyweight)v模式结构 运用共享技术有效地

30、支持大量细粒度的对象。武汉科技大学外观模式外观模式(Facade)(Facade) 一个合理的设计就是为这些子系统创建一个统一的接口,这个接口将简化客户程序的判断操作。 引入Facade模式后的类结构图为子系统中的一组接口提供一个一致的界面,本模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。武汉科技大学代理模式代理模式(Proxy)(Proxy)v模式结构 为其他对象提供一种代理以控制对这个对象的访问。武汉科技大学状态模式状态模式(State)(State)武汉科技大学状态模式状态模式(State)(State)v模式结构 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。武汉科技大学模板方法模式模板方法模式(Template Method)(Template Method)v模式结构 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。武汉科技大学策略模式策略模式(Strategy)(Strategy)武汉科技大学策略模式策略模式(Strategy)(Strategy)v模式结构 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。武汉科技大学中介者模式中介者模式(Mediator)(Mediator)v模式结构 外观外观模式(模式(Facade)和中介者模式()和中介者模式

温馨提示

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

评论

0/150

提交评论