评设计模式2

5. Bridge 模式

 其实桥接模式在类库的开发中经常用到,只是不知学名如此。有一次面试,问我知不知道Visitor模式,我想了想说,我可能已经用过但不知道那就是Visitor模式。我答的真是老奸巨滑啊,呵呵。不过现在看来确实是已经用过。

   桥接模式的核心是把与该类核心功能无关的功能外包出去,并且在定义用以引用外包对象的外包属性时,使用抽象的外包基类或接口来定义,而不是使用具体的外包类。这就解决了所谓的维度变化问题. 类本身的功能变化是一个维度,由外包属性关联的外包类的变化是另一个维度;如果外包类本身还关联着别的外包类,则就是第三个维度了,如此类推,可以推出N维。我的类库中产生过三维以上的维度。

   桥接模式从效果来看,实现了组合使用对象的目的。

   从某种角度来看,可以把外包属性看成类似于快捷方式的作用。

6.Adapter 模式

  此模式的核心是通过适配器类把适配对象转换为客户对象预期的目标接口,从而使得客户对象可以使用适配对象的成员。

  这里涉及到四种对象:Adapter(适配器),Adaptee(适配对象) ,Client(客户对象),Target(目标接口)

   此模式的效果就好比给灰太狼套上一张羊皮,然后让灰太狼混在羊堆里一起咩咩叫。

  

  此模式有两个实现方式:

  如果Adapter继承Adaptee,并实现Target接口,则此谓之类适配器。(也就是说如果Adaptee和Target都是类,则这事儿C#是干不了)

  如果Adapter实现Target接口,然后Adapter定义了一个Adaptee类型的属性,则此谓之对象适配器。(这样即使Adaptee和Target都是类,这事儿C#也干得了)

 

   举个例子:

   类A使用桥接(Bridge)模式,定义了一个类型为接口B的外包属性P1。类A在其成员方法中通过P1调用了接口B的方法F1。

   现在有一个类C,它有一个和F1一样用途方法F2(签名可能和F1不同)。

   现在任务是:在不修改类A和类C的情况下让类A使用类C的F2。这要怎么实现呢?

   如果用类适配器来实现,则要这么做:

         定义一个新类D,让类D继承类C,并让其实现接口B。这样,在类D实现接口B的方法F1时,通过调用this.F2的形式完成功能。

   如果用对象适配器来实现,则要这么做:

         定义一个新类D,让其实现接口B,然后在D上定义一个类型为类C的属性P2.这样,在类D实现接口B的方法F1时,通过调用P2.F2的形式完成功能。   

   这里类D就是Adapter,类C是Adaptee ,类A是Client,类B是Target

    由此看来,如果使用类适配器,则有一个Adaptee 就要有一个Adapter类;而对象适配器在Adaptee有基类或实现某一接口时,则用一个Adapter即可。

   

    有的人说ADO.NET里的DataAdapter是此模式的应用,我感觉不太像。我觉它的适配的含意不是这里说的接口适配,而是数据结构和SQL文的自动转换。

    它和Bridge模式模式的区别是:Bridge模式强调的是类A这面,而适配器模式强调的是类A的外包类这一面。

 7.Prototype 模式

   此模式的核心是克隆(复制)对象实例来创建新对象。

   有两种不同层次的克隆:

         浅表复制:只复制现有实例的部分属性,通常是描述结构信息的属性,典型例子是DataTable.Clone()方法。

         深层复制:复制现有实例的全部可复制的属性,既包括描述结构信息的属性、也包括数据性质的属性,典型例子是DataTable.Copy()方法

 

   实现深层复制的便捷方法是使用序列化技术

   此模式可应用于想利用现有对象快速创建新对象、避免从头创建对象然后再依次为属性赋性的重复过程,从而加快应用的响应速度。

   也可用此模式创建对象的简化版本,比如得到携有相应信息的基类或平行子类的一个实例。

   可以把原型实例看成一个缓存。

 8.Builder 模式

   此模式的核心是把可按确定步骤创建的复杂对象的创建步骤和每个步骤的具体实现分离开来。

   其中,封装步骤组合的类称为指导者(Director),实现具个每个步骤的类称为建造者(Builder),产生的复杂对象称为产品(Product)。一般来说,Builder都是有基类或基接口的,如果只有一个Builder则可以省略Director角色。

   其实程序中会经常用到类似的做法,在方法中的一系列操作都是通过调用定义为接口或基类的变量执行,只不过不返回一个对象罢了

 

posted on 2010-05-15 15:35  Apollo Sun  阅读(1177)  评论(0编辑  收藏  举报

导航