第六次作业

结构型模型

1 Adapter适配器模式

将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

2 Bridge桥接模式

将抽象部分与它的实现部分分离,使它们都可以独立地变化。

3 Composite组合模式

将对象组合成树形结构以表示‘部分-整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

4 Decorator装饰者模式

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活。

5 Facade外观模式

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

6 Flyweight享元模式

为运用共享技术有效地支持大量细粒度的对象。

7 Proxy代理模式

为其他对象提供一种代理以控制对这个对象的访问。

14.  Template Method模板方法 

 意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Template Method模式的几个要点

1.Template Method模式是一种非常基础性的设计模式,在面向对象系统中有着大量的应用。它用最简洁的机制(虚函数的多态性)为很多应用程序框架提供了灵活的扩展

点,是代码复用方面的基本实现结构。

2. 除了可以灵活应对子步骤的变化外,“不要调用我,让我来调用你”的反向控制结构是Template Method的典型应用。

3.在具体实现方面,被Template Method调用的虚方法可以具有实现,也可以没有任何实现(抽象方法、纯虚方法),但一般推荐将它们设置为protected方法。

15.  Command 命令

耦合与变化

耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。

Command 命令的意图:

将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

Command模式的几个要点

1. Command模式的根本目的在于将“行为请求者”与“行为实现者” 解耦,在面向对象语言中,常见的实现手段是“将行 为抽象为对象”。

2.  实现Command接口的具体命令对象ConcreteCommand有时候根据需要可能会保存一些额外的状态信息。

3.通过使用Composite模式,可以将多个“命令”封装为一个“复合命令”MacroCommand。

4.  Command模式与C#中的Delegate有些类似。但两者定义 行为接口的规范有所区别:Command以面向对象中的“接口-实现”来定义行为接口规范,更严格,

更符合抽象原则;Delegate以函数签名来定义行为接口规范,更灵活, 但抽象能力比较弱。

16.Interpreter 解释器

Interpreter模式的几个要点

1. Interpreter模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易抽象为语法规则

的问题”才适合使用Interpreter模式。

2. 使用Interpreter模式来表示文法规则,从而可以使用面向对象技巧来方便地“扩展”文法。

3. Interpreter模式比较适合简单的文法表示,对于复杂的文法表示,Interperter模式会产生比较大的类层次结构,需要求助于语法分析生成器这样的标准工具。

17. Mediator 中介者

要点:

1.将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。

2. 随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。

3.Façade模式是解耦系统外到系统内(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。

18. Iterator 迭代器

要点:

1.迭代抽象:访问一个聚合对象的内容而无需暴露它的内部表示。

2. 迭代多态:为遍历不同的集合结构提供一个统一的接口,从而支持同样的算法在不同的集合结构上进行操作。

3.迭代器的健壮性考虑:遍历的同时更改迭代器所在的集合结构,会导致问题。

19. Observer 观察者

定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。

要点:

1.使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。

2.目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。观察者自己决定是否需要订阅通知,目标对象对此一无所知。

3. 在C#的event中,委托充当了抽象的Observer接口,而提供事件的对象充当了目标对象。委托是比抽象Observer接口更为松耦合的设计。

C#面向对象设计模式纵横谈

1、Chain of Responsibility模式的几个要点:

(1)Chain of Responsibility 模式的应用场合在于“一个请求可能有多个接受者,但是最后真正的接受者只有一个”,只有这时候请求发送者与接受者的耦合才有可能出现“变化脆弱”的症状,职责链的目的就是将二者解耦,从而更好地应对变化。

(2)应用了Chain of Responsibility 模式后,对象的职责分派将更具灵活性。我们可以在运行时动态添加/修改请求的处理职责。

(3)如果请求传递到职责链的末尾仍得不到处理,应该有一个合理的缺省机制。这也是每一个接受对象的责任,而不是发出请求的对象的责任。

2、备忘录(Memento)模式的设计意图是:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

3、Memento模式的几个要点:

(1)备忘录(Memento)存储原发器(Originator)对 象的内部状态,在需要时恢复原发器状态。Memento模式适用于“由原发器管理,却又必须存储在原发器之外的信息”

(2)在实现Memento模式中,要防止原发器以外的对象访问备忘录对象。备忘录对象有两个接口,一个为原发器使用的宽接口;一个为其他对象使用的窄接口。

(3)在实现Memento模式时,要考虑拷贝对象状态的效率问题,如果对象开销比较大,可以采用某种 增量式改变来改进Memento模式。

4、状态模式:允许一个对象在其内部状态改变时改变它的行为。从而使对象看起来似乎修改了其行为。

5、State模式的几个要点:

(1)State模式将所有与一个特定状态相关的行为都放入一个State的子类对象中,在对象状态切换时,切换相应的对象;但同时维持State的接口,这样实现了具体操作与状态转换之间的解耦。

 (2)为不同的状态引入不同的对象使得状态转换变得更加明确,而且可以保证不会出现状态不一致的情况,因为转换是原子性的——即要么彻底转换过来,要么不转换。

 (3)如果State对象没有实例变量,那么各个上下文可以共享同一个State对象,从而节省对象开销。

6、策略模式:定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。

7、Strategy模式的几个要点:

(1)Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。

(2)Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。

(3)与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。

8、Visitor:表示一个作用于某对象结构中的各元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。

9、Visitor模式的几个要点:

(1)Visitor模式通过所谓双重分发(double dispatch)来实现在不更改Element类层次结构的前提下,在运行时透明地为类层次结构上的各个类动态添加新的操作。

(2)所谓双重分发即 Visitor模式中间包括了两个多态分发(注意其中的多态机制):第一个为accept 方法的多态辨析;第二个为visit方法的多态辨析。

(3)Visitor模式的最大缺点在于扩展类层次结构(增添新的Element子类),会导致Visitor类的改变。因此Vistor模式适用于“Element类层次结构稳定,而其中的操作却经常面临频繁改动”。

posted @ 2021-02-25 18:07  计应192西一组  阅读(51)  评论(0编辑  收藏  举报