设计模式 (2)

设计模式

Design Pattern

什么是设计模式

设计模式这个术语是由Erich Gamma等人在1990年代从建筑设计领域引入到计算机科学的。它是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。\r设计模式并不直接用来完成程式码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。面向对象设计模式通常以类别或物件来描述其中的关系和相互作用,但不涉及用来完成应用程式的特定类别或物件。设计模式主要是使不稳定的依赖于相对稳定、具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。\r设计模式是一种经验的复用。

GoF设计模式的表述格式

\r模式名:每一个模式都有自己的名字,模式的名字使得我们可以讨论我们的设计。 \r问题:在面向对象的系统设计过程中反复出现的特定场合,它导致我们采用某个模式。 \r解决方案:上述问题的解决方案,其内容给出了设计的各个组成部分,它们之间的关系、职责划分和协作方式。 \r别名:一个模式可以有超过一个以上的名称。这些名称应该要在这一节注明。 \r动机:该模式应该利用在哪种情况下是本节提供的方案(包括问题与来龙去脉)的责任。 \r适用性:模式适用于哪些情况、模式的背景等等。 \r结构:这部分常用类图与互动图阐述此模式。

GoF设计模式的表述格式

参与者:这部分提供一份本模式用到的类与物件清单,与它们在设计下扮演的角色。 \r合作:描述在此模式下,类与物件间的互动。 \r影响:采用该模式对软件系统其他部分的影响,比如对系统的扩充性、可移植性的影响。影响也包括负面的影响。这部分应描述使用本模式后的结果、副作用、与权衡(trade-off) \r实作:这部分应描述实现该模式、该模式的部分方案、实现该模式的可能技术、或者建议实现模式的方法。 \r示例:简略描绘出如何以编程语言来使用模式。 \r已知应用:业界已知的实作范例。 \r相关模式:这部分包括其他相关模式,以及与其他类似模式的不同。

设计模式的好处

提炼出专家的经验和智慧,为普通的开发人员所用。\r它们的名字组成一个词汇表,便于开发人员进行交流。\r系统的文档若记载了该系统所使用的模式,则有助于人们更快的理解系统。\r它们使得对系统改造变得容易,无论系统原来的设计是否采用了模式。

设计模式与OO设计原则

\r不要轻视OO的设计原则,因为每个设计模式背后都包含了几个OO的原则和概念。\r很多时候,在设计出现两难的情况下,我们必须回到OO的原则以方便判断取舍。\rOO设计原则是我们的目标,而设计模式是我们的做法。

OO的设计原则

封装变化\r多用组合,少用继承\r针对接口编程,不针对实现编程\r交互对象间的设计应是松耦合\r对扩展开发,对修改关闭(开-闭原则)\r依赖抽象,不要依赖具体类(依赖倒置原则)\r只和朋友交谈(最少知识原则)\r别找我,我会找你(好莱坞原则)\r类应该只有一个改变的理由

Duck的例子

呱呱叫

外观是绿头

外观是红头

现在需要鸭子能飞

外观是绿头

外观是红头

新加的方法

所有子类都会\r继承fly()

问题出现了,橡皮鸭子满天飞

超类中加入的fly()会导致所有子类具备fly(),连那些不该具备的子类也无法免除。

解决方案之一与其存在的问题

解决方法一\r在每个子类中覆盖fly()\r问题\r如果以后加入decoyDuck怎么办,诱饵鸭子是木头的不会飞也不会叫。\r对于以后每个新加入的子类都要检查呱呱叫(quack) 和 飞行(fly)。 不易维护和扩展。\r

使用OO设计原则

抽取变化\r取出容易变化的部分,将鸭子的飞行行为和呱呱叫行为抽取出来\r针对接口编程\r设计两个接口,FlyBehavior 和 QuackBehavior,还有它们对应的类,负责实现具体的行为。\rHas A 比 Is A 好。 新鸭子类的行为使用了组合。

FlyBehavior 和 QuackBehavior

新的鸭子类

行为变量声明为接口类型(flyBehavior, quackBehavior)\rPerformxxx() 取代了fly() 和quack(),内部调用行为变量的quack()和fly()方法\rPublic class Duck{\rQuackBehavior quackBehavior;\r//…\rPublic void performQuack(){\r quackBehavior.quack();\r }\r}

封装行为的大局观

策略模式

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

设计模式的分类

创建型\r工厂方法(Factory method)\r抽象工厂(Abstract factory)\r生成器(Builder)\r原型(Prototype)\r单件(Singleton)\r结构型\r适配器(Adapter)\r桥接 (Bridge)\r组合(Composite)\r装饰者 (Decorator)\r外观 (Facade)\r享元 (Flyweight)\r代理 (Proxy)\r行为型\r解释器 (Interpreter)\r模版方法 (Template method)\r职责链 (Chain of responsibility)\r命令 (Command)\r迭代器 (Iterator)\r中介者 (Mediator)\r备忘录 (Memento)\r观察者 (Observer)\r状态 (State)\r策略 (Strategy)\r访问者 (Visitor)

介绍几个常用的模式

单件模式\r工厂方法\r适配器\r组合模式\r代理模式\r模版方法\r命令模式\r状态模式\r观察者模式

讨论

MS1的开发中都用到了哪些模式?

Q