Chinaunix首页 | 论坛 | 博客
  • 博客访问: 605912
  • 博文数量: 138
  • 博客积分: 3067
  • 博客等级: 中校
  • 技术积分: 1565
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-21 12:44
文章分类

全部博文(138)

文章存档

2016年(5)

2014年(4)

2012年(1)

2011年(2)

2010年(10)

2009年(19)

2008年(97)

我的朋友

分类:

2008-11-06 17:27:33

当一个对象,它可能发生两种变化:A维度和B维度。那么,我们就把A抽象出来叫做AbstractA,把B抽象出来叫做AbstractB。把它们 组合起来,简单说就是把AbstractB的一个实例放在AbstractA中。B变化是辅助的抽象,主逻辑再A中。独立实现B的抽象以便以后使用 。在实现了AbstractA的具体实例中,我们就可以使用抽象B,而不去关心抽象B是怎么实现的。只需要传进去一个抽象B的具体实现实例就行了。在抽象 A中,我们可以任意组合这两个维度,这就解决了一个对象两个维度剧烈变化的问题,就算它们纵横交错我们也不怕。


桥接模式的关键点和重点在与面向对象设计的原则:Prefer组合To继承。实际上使用多继承也是可以解决这些问题,但是并不是我们推荐的,这种多继承往 往违背单一职责原则。而且,C#不支持多继承,所以必须继承两个接口。那么,抽象A和抽象B就使平等的关系,而抽象B不是主要的,它本身也许并没有什么独 立的意义,这样就搞混了类之间的关系。

 

那么之前我学习了适配器模式,同样作为结构型模式,适配器模式更多的用在匹配原有接口,以适应新的变化要求.对于用户来说,原有的接口是黑盒的,不可见的.

而桥接模式更多的用在两条线的变化需求上.在设计的初期,应对主逻辑和辅逻辑的变化,我们就用桥接模式,把辅逻辑接口组合到主逻辑接口中,然后让他们分别去实现.

而在设计完成以后或者开发已经结束,发现现有的接口不能满足需求,那么我们就使用适配器模式,创建新的接口适配原接口以满足需求.





装饰者,什么是装饰者?它就是继承抽象对象,然后再组合这个抽象对象(既有IsA关系,又有HasA关系),此时,在装饰着里添加想要增加的行为,同时要实现具体的A的行为,这样就增加了新的功能。
在构造装饰者时,初始化抽象对象。

装饰着模式实现了在运行时动态扩展对象功能的能力,不需要单独使用继承来扩展功能,不会产生子类膨胀的问题。装饰者在外部扩展对象的功能,装饰者要 知道这些待扩展的对象,而待扩展的对象是不知道这些装饰者的,在运行时却可以使用这些功能。对象被装饰(扩展)后,仍然还是原来的对象(具有IsA的关 系).

这就像墙不需要知道粉刷它的油漆,但是油漆必须知道要刷哪些(面)墙.在墙刷完了漆以后,它还是墙(IsA)的关系.

装饰着是比较容易理解的设计模式之一,我觉得重点在于装饰者和待扩展对象之间同时具有IsA和HasA这两种关系,并且在使用时,经过装饰的对象仍然是原来的对象,仍然具有原来对象的特征,因为,装饰者仅仅是增加了功能而以。

李建忠老师说,装饰者模式的要点在于解决"主体类在多个方向上的扩展问题",我觉得说的非常的贴切。

和以往一样,我还想说一下装饰者模式和适配器模式的区别与联系。刚开始学适配器的时候,总觉得适配器可以应用的增加新功能的场合,应为适配器里面有 HasA的关系。却不知道适配器,从它的名字都可以看出来,是为了适应某种行为。也就是让本来不能使用的东西通过某种转换可以使用,适配嘛。它的关键在于 一种转换,而装饰者,还是从名字看,装饰嘛,是增加。适配是复用现存的类,使它的接口与新的环境要求相一致。装饰者是为现存的对象动态的增加新功能,重点 解决动态的问题(子类膨胀的问题)。

外观模式注重简化接口,在引用时不必关心内部实现,只需要关心外部接口就可以了。其实就是把一些相关的类(注意:是相关的类)揉在一起以方便访问。

综合比较外观模式,适配器模式,桥接模式,装饰者模式,我们可以看到,外观模式关注的是接口简化问题,使访问变得简单;适配器模式使本来不合适的接 口变得合适,是一种接口转换;桥接模式把两个变化的维度接成一个,把辅逻辑揉进主逻辑,同时进行抽象,让变化分离出来,使变化不会影响稳定的部分,关注的 是抽象与实现的分离;装饰者模式关注为对象增加新功能。










创建型模式,主要用来解决new所带来的对象间的耦合关系,除了singleton和prototype之外,都需要使用factory来负责对象的实例化,prototype是通过原型(也就是抽象)来克隆对象。

 

白话一点儿说,创建型模式就是把有可能经常变化的对象单独拎出来处理,使这些经常变化的部分在发生变化时不会影响整个系统。

 

GOF设计模式有5种是创建模式.

其中Singleton模式用来控制对象创建的个数,一般是一个,可以通过变化创建指定数量的对象.

 

factory method模式是最最基础的创建型模式,也是最基础的设计模式之一。既然是面向对象编程,当然要创建对象。factory method模式就是解决了对象的基本创建问题。对象通过自己的工厂创建实例,在创建点不 依赖具体实现而仅仅依赖于对象自己的抽象。编译时只知道要创建哪种对象(抽象),运行时才知道具体会创建这种对象的哪个对象。反正一种对象的行为都是相似 的,所以抽象也是一样的。只是具体实现不同。比如车都能转弯,只是摩托车和汽车转弯的具体实现不同,但抽象是相同的。这里编译时只说车要转弯,在运行时再 具体告诉程序是哪个车要转弯。

 

abstract factory模式是在factory method模式的基础上发展而来, factory method模式只解决了创建哪个对象的问题,而abstract factory解决了创建哪个系列对象的问题。这一系列对象之间可能有很多关联和交互。白话点而说就是,比如我们肯定都用床上用品,包括床单,被罩和枕巾 等。我们不会一辈子都用一套吧,肯定要换洗的,有坏的还得换新的(这里假设整套整套坏/换)。那么abstract factory就用上了。一次创建一套床上用品,不用修改任何地方,只需要增加新的床单类,被罩类和枕巾类,然后在调用时告诉系统,我要用这个新的。就 OK了,符合了面向对象的对修改关闭对扩展开放的原则。

 

builder模式与factory method一样,都是创建一个对象。但是它却是创建了一个超级复杂的对象。它可以让我们通过相同的创建过程创建出不同的表示。在这里,创建对象的算法是 稳定的,但是对象的各个部分却是不稳定的,经常会变。比如要建造一个房子,建造房子的过程,比如打地基,搭架子,垒砖这些骨干的过程是不变的,这是稳定的 算法。但是在造门和窗户的时候却有可能经常发生变化。有可能这个房子要用A工厂的门,那个房子却要用B工厂的门。这是就要用到builder模式了。不管 你用谁的门,但是造出来的肯定得是房子。

 

prototype模式诠释了面向对象的依赖倒置原则。当一个Manager对象依赖某个具体实现时,我们把这个实现抽象出来(前提是这个对象是易变的),使Manager对象依赖于这个抽象,这样,以后扩展新的基于这个抽象的实现就会easy了。而manager里通过抽象的克隆创建需要数量的对象。这样,manager只依赖抽象。我想这也是我们提倡面向接口编程的原因。

 

总之,创建型模式解决了软件设计中对象创建的问题,通常,往往是我们遇到了易变类,才会使用创建型模式,至于使用哪种,就要看易变类和系统的特性了。

 

阅读(784) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~