软考之设计模式篇

仅为了软考需要,整理文档,供自己复习使用

一 设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

二 各种设计模式:

1 单例模式

2 工厂模式

 工厂方法,只有一个抽象的方法,由子类完成实例化。抽象工厂,有抽象多个方法。这是2个的主要区别。

简单工厂 extends 抽象工厂或者工厂方法,不能称为模式。而抽象工厂或者工厂方法可以称为模式,因为可以重用,被当成模板。

3 建造者模式(builder)



 



 java中应用:

StringBuffer:线程安全,StringBuilder:性能好

4 原型模式 (prototype)

 通过"复制"一个已经存在的实例来返回新的实例,而不是新建实例。被复制的实例就是我们所称的"原型",这个原型是可以定制的。

1 跟JVM有关 2 implements cloneable 3 ovveride clone()

使用场景:原型模式多用于创建复杂的或耗时的实例,因为这种情况下,复制一个已经存在的实例使程序运行更高效;或者创建值相等,只是命名不一样的同类数据。原型模式的关注点在于大量相似对象的创建。



 

5 适配器模式(Adapter)

将一个类的接口转换成客户希望的另外一个接口

 

6 装饰者模式(Decorator),又称包装(Wrapper)模式

动态地给一个类添加一些额外的职责.不同装饰者可相容,彼此透明。基于现有方法的扩展。



 

7 代理模式(Proxy)

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



 

8 外观模式(facade)

"接口简化",为子系统中的一组接口提供一个一致的对外接口。处理客户与系统间的关系,单向。(与中介者对比)。用单个对象表示整个系统。



 应用场景: 

1)为一个复杂子系统提供一个简单接口。

2)提高子系统的独立性,实现松耦合。

3)在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

参考:http://www.cnblogs.com/devinzhang/archive/2012/01/06/2315200.html

9 桥接模式(bridge)

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



 应用场景

(1)不希望在抽象及抽象的实现部分之间有一个固定的绑定关系。

(2)类的抽象及它的实现都应该可以通过生成子类的方法加以扩充,使用桥接模式可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。

(3)对一个抽象的实现部分修改应该对用户不产生影响,即客户的代码不必重新编译。

 

参考:http://blog.163.com/xiaokangzhijia@126/blog/static/1659548562010111843618596/

http://www.blogjava.net/qileilove/archive/2012/12/05/392498.html

10 组合模式(composite)

 将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.

 

 

 

11 享元模式(flyweight)

GoF对享元模式的描述是:运用共享技术有效地支持大量细粒度的对象。
Flyweight模式是构造型模式之一,它通过与其他类似对象共享数据来减小内存占用。也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。为了调用方便,FlyweightFactory类一般使用Singleton模式实现。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。

Flyweight模式的有效性很大程度上取决于如何使用它以及在何处使用它。当以下情况成立时使用Flyweight模式:
1 一个应用程序使用了大量的对象。
2 完全由于使用大量的对象,造成很大的存储开销。
3 对象的大多数状态都可以变为外部状态。
4 如果删除对象以外的状态那么可以用相对较少的共享对象取代很多组对象。
5 应用程序不依赖于对象标识。



 

 

 

参考:http://www.cnblogs.com/itTeacher/archive/2012/12/20/2826058.html

http://hi.baidu.com/isswangqing/item/2af19d75decab32ed7a89cb8

12 策略模式(Strategy)

又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

 

 缺点

1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类。2.造成很多的策略类。

解决方案:采用工厂方法

http://www.cnblogs.com/mengdd/archive/2013/01/19/2867443.html

13 模板方法模式(Template Method)

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。



 

14 观察者模式

 

15 迭代子模式(Iterator)

迭代子模式又叫游标(Cursor)模式,是对象的行为模式。迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(internal representation)。



 

优点

聚集类的设计简单,不必对外提供遍历api。

一个聚集对象可以同时有几个迭代在进行中。

客户端不必知道聚集的具体类型。就可以读取和遍历聚集对象。即使聚集对象的类型发生变化也不会影响客户端的遍历。

缺点

迭代子模式给客户端一个聚集被顺序化的错觉

迭代子给出的聚集元素没有类型特征。(应用泛型可解决此问题)

http://blog.csdn.net/cheekis/article/details/4027124

16 责任链模式(Chain of Responsibility)

在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。



 

17 命令模式(command)1:1关系

将请求封装在对象中,这样它可以作为参数来传递,也可以被存储在历史列表或者以其他方式使用。

 


 

19 备忘录模式(memento)

又称标记(Token)模式,快照模式(Snapshot Pattern)。备忘录对象是一个用来存储另外一个对象内部状态的快照(snapshot)的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,从而可以在将来适合的时候把这个对象还原到存储起来的状态。备忘录模式常常与命令模式和迭代子模式一同使用。

涉及三个角色:备忘录(Memento)角色、发起人(Originator)角色、负责人(Caretaker)角色。


 

功能:

发起人(Originator):负责创建一个备忘录Memento,用以记录当前时刻自身的内部状态,并可使用备忘录恢复内部状态。Originator可以根据需要决定Memento存储自己的哪些内部状态。
备忘录 ( Memento ): 负责存储Originator对象的内部状态,并可以防止Originator以外的其他对象访问备忘录。备忘录有两个接口:Caretaker只能看到 备忘录的窄接口,他只能将备忘录传递给其他对象。Originator却可看到备忘录的宽接口,允许它访问返回到先前状态所需要的所有数据。
管理者(Caretaker):负责备忘录Memento,不能对Memento的内容进行访问或者操作。

http://blog.csdn.net/fg2006/article/details/6575760

20 状态模式(state)

允许一个对象在其内部状态改变时改变它的行为。这个对象看起来似乎修改了它的类

  应用场景:如果需要在 1、不同的状态(可能会对应相应的行为), 2、不同的行为;  间反复进行切换,则应优先考虑状态模式



 

21 访问者模式(visitor)

目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。属性不变,方法扩展。不同访问者不相容,操作替换。(与装饰者对比)


 

22 中介者模式(mediator)

场景:集中负责维护对象模型的关系完整性 以及需要 封装对象间交互方式的时候.

简单点来说,将原来两个直接引用或者依赖的对象拆开,在中间加入一个“中介”对象,使得两头的对象分别和“中介”对象引用或者依赖。将多对多关系变为多对一,是系统与系统间的内部关系,双向。(与外观模式对比)



 

23 解释器模式(Interpreter

 应用:如果一种特定类型的问题发生的频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。而且当文法简单、效率不是关键问题的时候效果最好。 



 

 

 

参考:http://zz563143188.iteye.com/blog/1847029

猜你喜欢

转载自yinger-fei.iteye.com/blog/1959800