求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
学习总结-设计模式理解(二)

2010-07-07 作者:elimago 来源:elimago的blog

 

2.  面向对象原则

3.  UML基础

4.  设计模式

5.  创建型模式

5.1. 创建型解释

创建型模式的目的:动态创建对象

创建型模式分为两类:

1) 类创建模式

类创建型,其实就是继承,通过子类继承父类,达到创建子类的的过程。子类将拥有父类所有的内容。

2)对象创建模式

对象创建型,其实是把对象的创建过程,委托另外一个类动态来实现

稍作,如果一个客户端,有可能需要到A1类,A2类,但是我不清楚什么时候需要A1或者A2,为了达到能够根据实际需要动态来创建,我们委托A类,A类能够有办法根据我们的需要动态来创建A1类或者A2类。

为了能够使得A类能够根据客户端需要动态创建A1类,A2类等等,我们需要一种模式,就是“创建型”模式。

5.2. 单例模式

单例模式:保证只实例化一个对象

5.3. 工厂方法

工厂方法:让子类决定创建哪一个对象

5.4. 抽象工厂模式

抽象工厂模式:创建一些列相关对象

5.5. 建造者模式

Builder中定义建造内容,Director定义建造过程,最终由Director指导建造产品,返回一个Product。

建造者:建造一个需要固定初始化内容的对象(其实是返回一个已经经过设置过的对象)。

5.6. 原型模式

原型模式:创建一个对象的副本,可以创建当前对象状态的副本

6.  结构型模式

6.1. 结构型解释

结构型模式的目的:通过类及对象的组合,形成更大的结构

结构型模式分为两种:

1)类结构模式

类结构模式,是通过继承方式,来组合接口和实现。例如使用多重继承组合两个以上的类或对象接口,形成一个大类或者接口,最终结果是父类的结构和对象接口的结构结合起来。

类结构模式是静态的,其典型代表:适配器模式,其实现方式是通过继承另外一个雷的接口达到接口的统一一致。

2)对象结构模式

对象结构模式,是通过组合对象产生新的功能。

对象结构模式是动态的,因为它可以在运行期间随时改变对象的组合。

6.2. 外观模式

外观模式:定义一个高层接口,是的子系统更易使用

高层引用底层,就变成了高层依赖底层的设计结构,程序设计过程中,底层发生变化,会导致高层变化,应变能力差。

外观模式:使得子系统调用变得容易。

6.3. 适配器模式

适配器改变了“外观模式(简易版)”,充分利用设计原则“依赖倒转”原则,使得“高层依赖底层”变更为“依赖接口”,实现针对接口的编程。

适配器:使得接口变得统一

6.4. 代理模式

代理模式:把真实对象进行隐藏,真实对象的工作由代理对象完成

代理模式:隐藏真实对象。

6.5. 桥接模式

桥接模式:把分类和实现分离,又通过组合可以得到动态类的方法;又可理解为“多角度”分类。

桥接模式:抽象与实现的分离,实现动态方法。

6.6. 享元模式

享元模式:定义共享类工厂,通过共享类工厂提供的索引来获取相应的对象(有点类似创建型模式),通过共享对象,减少对象的数量,减少存储的开销。

享元模式设计时,尽可能把外部状态通过一些方法来获取,动态设置,保证最大的共享。

享元模式:为共享类提供统一的开放接口。

6.7. 组合模式(自组合)

组合模式:采用自组合方式,通过自组合方式,把对象组合成树形结构,体现“部分-整体”的层次结构,但是类仍具有同样的接口方法,使得客户端对单个对象或者组合后的对象都具有一致性的操作。

其中display()方法通过“循环遍历”方式,获取每个对象,并调用每个对象的方法,而对于外界,接口只有一个,即display()。

类似“对象递归”

比如:

A、B、C

B增加到A,得到整合对象,则A对象包含B对象。

如果把C增加到B,那么则得到B包A,最后的结果为:

外部调用display()方法的时候,其实是先调用A.display(),然后B. display(),然后C. display(),知道A所包含的对象全部搜索完毕。

动态组合对象,形成更大的对象,为了使得此大对象能够实现功能统一调用,所以采用组合模式。

 

6.8. 装饰模式

装饰模式:动态为一个对象增加方法,方法的最终执行是有序的。

比如现在需要A对象在原来的基础上增加B,C的功能,那么可以采用装饰模式,先在B中增加C的方法,然后在再在A中增加B的方法,这样最终得到的结果是A拥有了B和C的方法。

7.  行为型模式

7.1. 行为型模式解释

行为型模式的目的:将流程控制转移为对象的互动

行为型模式不仅描述了类或对象本身,同时也描述了他们之间的交互。这些类或对象之间有着不同的算法和职责,行为型模式将此类对象进行互动,从而形成工作流控制。

行为型模式分为:

1)类行为模式

类行为模式通过继承方式在类之间分配行为。

模板方法、解释器模式即是类行为模式。

2)    对象行为模式

对象行为模式是使用对象组合,从而达到对象的交互,它分为两种

a)一种是描述了一组对象如何相互协同以完成一项任务,

b)一种是用于将行为封装在一个对象,并将互动请求为委派给次对象

7.2. 观察者模式

 

流程控制转为对象互动:通过对象的相互包含和方法的相互调用,实现行为的互动。

观察者模式:主题可以广播专题给订阅了该主题的观察者。

观察者模式实现方式:主题聚合了观察者,同时通过Notify来调用所有观察者对象的某个方法Update,观察者同样也关联主题,通过Update方法获取主题的状态。

观察者流程控制:通过方法的互相调用实现,只有两个节点,一发一收

其实观察者我们可以理解为以下几部分:

步骤一:

因为主题聚合观察者,同时可以通过Notify调用观察者的Upate方法,所以以上步骤其实是外观模式的一种应用,只是这里聚会了更多的观察者对象,调用观察者对象方法的时候,采用遍历所有观察者对象,达到所有观察者方法的调用

步骤二:

观察者包含主题对象,通过Update方法获取主题对象的状态(当然如果又调用主题的方法也是没有问题的),其实这也是外观者模式的应用。

步骤三:

最终结果就是由一个入口,然后从主题调用观察者,观察者又引用主题的状态。

注意:如果Update不是获取主题专题,而是调用Notify,你就等着死机吧(死循环)。

7.3. 模板方法

模板方法:通过抽象类,定义算法和算法框架,把具体算法实现延伸到子类,通过子类的多态性,实现不同的算法,但却具有同样的算法框架。

模板方法,可以把公用的方法定义在抽象类,把细微的变化实现定义在子类,最大程度实现代码的复用。即可以适当复用目的,又可以达到细微调整效果。

模板方法流程控制:流程定义在模板方法中

7.4. 命令模式

命令模式,命令类把通过命令执行方法调用接受者的动作(Excute()调用Receiver的Action方法),然后请求者通过调用命令者的Excute方法来执行接收者的方法。对于客户端,只要使用请求对象和命令对象,即可实现所要的结果

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

敏捷开发原则:不要为代码添加基于猜测的、实际上不需要的功能,如果不清除一个系统是否需要命令模式,一般不需要急着去实现它,事实上,在需要的时候通过重构实现这一模式并不困难,只有在真正需要如撤销/恢复操作等功能,把原来的代码重构为命令模式才有意义。

命令模式的优点:

1) 它能够较容易地设计一个命令队列

2)在需要的情况下,可以容易地将命令记入日志

3)允许接受请求的一方决定是否要否决请求

4)可以容易地实现对请求的撤销和重做

5)由于加进新的具体命令不影响其他类,因此增加新的命令类很容易

6)把请求一个操作的对象与知道怎样执行一个操作的对象分割开(请求者、接受者)

命令模式的流程控制:

从某种意义上来讲,此种模式似乎是代理模式或者适配器模式的变体。

7.5. 状态模式

状态模式:通过Context对象合成State对象,当调用Request的时候,间接调用了StateHandle的方法,StateHandle方法有包含了状态子类的互动,状态子类之间的互动方式是通过调用Context的Request实现。

状态模式的流程控制:在子类中中设置好了状态的转移方向。

状态模式解析:

状态模式有点类似观察者,只是观察者模式在Update中仅仅获取的是主题的状态,而状态模式在Handle中又调回了Context的方法,幸好调回Context方法的时候,传递的对象不是ConcreteA,否则也等着死机,同时状态模式一定要有一个节点,这个末节点不再调用会Context的对象或者其他方式,保证终止,如果末节点又调回之前的状态,那就乱套了!

7.6. 职责链模式

职责链:自包含方式,通过外部定义流程对象进行数据转发。在HandleRequest方法中包含了对Handle对象的HandleRequest的调用,从而达到对象直接的互动。至于对象是从A到B,或是B到C,则是在客户端定义。

职责链流程控制:职责链的流程方向是定义在客户端,由客户端制定要转到哪个对象,节点也是两个。

7.7. 解释器模式

7.8. 中介者模式

中介者模式:两个对象,通过中介者进行相互作用,中介者中定义了两者的互动方式。

7.9. 访问者模式

访问者模式:在对象结构中增加元素,通过调用对象结构中的Accept方法逐一访问元素的方法,元素的方法中包含了自身的方法Opeate(),同时又引用了访问者的方法,访问者的方法又引用了元素本身的一些信息或者方法。

访问者模式把数据结构和双方分开,把数据结构和作用于数据结构上的操作分开,使得操作集合可以相对自由地演化。

7.10.  策略模式

策略模式:通过定义Context对算法类方法的引用。

7.11.  备忘录模式

7.12.  迭代器模式



如何向妻子解释OOD
OOAD与UML笔记
UML类图与类的关系详解
UML统一建模语言初学
总结一下领域模型的验证
基于 UML 的业务建模


面向对象的分析设计
基于UML的面向对象分析设计
UML + 嵌入式系统分析设计
关系数据库面向OOAD设计
业务建模与业务架构
使用用例进行需求管理


某航空IT部门 业务分析与业务建模
联想 业务需求分析与建模
北京航管科技 EA工具与架构设计
使用EA和UML进行嵌入式系统分析
全球最大的茶业集团 UML系统分析
华为 基于EA的嵌入式系统建模
水资源服务商 基于EA进行UML建模
更多...