《java与模式》中模式总结

转自:http://hi.baidu.com/hannick/blog/item/e820d8947d51a541d1135e54.html

设计模式一览表

注:加*的为GoF23种设计模式。

一、      创建模式

工厂模式分类:

简单工厂(Simple Factory)模式:又称静态工厂方法模式(Static Factory Method Pattern)。

工厂方法(Factory Method)模式:又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式。

抽象工厂(Abstract Factory)模式:又称工具箱(KitToolkit)模式。

1.       简单工厂(Simple Factory)模式

又称静态工厂方法模式,是类的创建模式,由一个工厂对象决定创建出哪一种产品类的实例。

简单工厂模式简略类图:



 

工厂类角色(Creator):含有一个静态工厂方法,在客户端的直接调用下创建产品对象。

注:一般在工厂类的静态工厂方法中使用分支语句(如switch),根据相应的类型实例化具体的产品类。缺点是如果有新的产品加入到系统中,就需要修改工厂类,将必要的逻辑加入到工厂类中。

2.       工厂方法(Factory Method)模式*

又称多态性工厂(Polymorphic Factory)模式或虚拟构造子(Virtual Constructor)模式,是类的创建模式。其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

工厂方法模式简略类图:


 

抽象工厂角色(Creator),具体工厂角色(Concrete Creator),抽象产品角色(Product),具体产品角色(Concrete Product)。

注:工厂方法模式由于使用了多态性,克服了简单工厂模式的缺点,在引入新的产品时只需加入新的具体工厂角色即可。

3.       抽象工厂(Abstract Factory)模式*

又称工具箱(KitToolkit)模式,其用意是向客户端提供一个接口,使得客户端在不必指定产品的具体类型的情况下,创建多个产品族中的产品对象。

抽象工厂模式简略类图:


 

注:抽象工厂模式是为多个产品等级结构的系统而设计的。抽象工厂模式和工厂方法模式的最大区别是:工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。

4.       单例(Singleton)模式*

单例模式的3个特点:某个类只能有一个实例;它必须自行创建这个实例;它必须自行向整个系统提供这个实例。

单例模式实现方式:

1. 饿汉式单例类:


 

2. 懒汉式单例类:


 

5.       多例(Multiton)模式

实际上就是单例模式的自然推广。

应用举例:

语言和地区类的应用。

多例模式或多例类的特点:多例类可以有多个实例;多例类必须自己创建,管理自己的实例,并向外界提供自己的实例。

6.       建造(Builder)模式*

建造模式可以将一个产品的内部表象与产品的生产过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。

建造模式的简略类图:


 

抽象创建者角色(Builder);具体建造者角色(Concrete Builder);导演者角色(Director);产品角色(Product)

应用举例:

JavaMail(利用了JAFJava Activation Framework库包)先创建邮件的各个部分,然后组成一个邮件。

7.       原型(Prototype)模式*

通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。

原型模式的简略类图:


 

应用举例:

Java对象的复制实现:深复制和浅复制

二、      结构模式

8.       适配器(Adapter)模式*

把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。

适配器模式的简略类图:


 

目标角色(Target);源角色(Adaptee);适配器角色(Adapter)

9.       缺省适配(Default Adapter)模式

    作为适配器模式的一个特例,缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口进行扩展。

10.       合成(Composite)模式*

合成模式将对象组织到树结构中,可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。

合成模式的简单类图:


 

应用举例:

Java AWT库。

11.       装饰(Decorator)模式*

装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。

装饰模式的简单类图:


 

应用举例:

Java I/O

12.       代理(Proxy)模式*

代理模式给某一个对象提供一个代理对象,并由代理对象控制对源对象的引用。代理就是一个人或一个机构代表另一个人或者一个机构采取行动。某些情况下,客户不想或者不能够直接引用一个对象,代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须有系统的其他角色代为创建并传入。

代理模式的简单类图:


 

13.       享元(Flyweight)模式*

FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。

分类:

享元模式能做到共享的关键是区分内蕴状态和外蕴状态。

内蕴状态存储在享元内部,不会随环境的改变而有所不同。

外蕴状态是随环境的改变而改变的。外蕴状态不能影响内蕴状态,它们是相互独立的。

将可以共享的状态和不可以共享的状态从常规类中区分开来,将不可以共享的状态从类里剔除出去。客户端不可以直接创建被共享的对象,而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。

享元模式的简单类图:


 

14.       门面(Facade)模式*

外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有一个实例,也就是说它是一个单例模式。但整个系统可以有多个门面类。

Session门面模式是J2EE模式的一种,实际上也就是门面模式在J2EE框架中的应用;Session门面模式用一个SessionBean作为门面,封装一个工作流程中的商务对象之间的相互作用,Session门面对象管理商务对象并为客户端提供一个粗粒度的服务层。

15.       桥梁(Bridge)模式*

用意是将抽象化(Abstraction)与实现化(Implementation)脱耦,使得二者可以独立地变化。其提供了一种用聚合关系实现弱耦合的解决方案,即将继承关系转换为组合关系

桥梁模式简略类图:


 

系统含有两个等级结构:抽象化等级结构和实现化等级结构。

抽象化角色(Abstraction):抽象化给出的定义,保存有一个对实现化对象的引用

修正抽象化角色(Refined Abstraction):扩展抽象化角色,改变和修正父类对抽象化的定义。

实现化角色(Implementer),具体实现化角色(Concrete Implementer)。

应用举例:

1.大多数驱动器的实现(如JDBC驱动器)。

2.飞机制造:

飞机制造商:空中巴士(Airbus),波音(Boeing),和麦道(McDonnell-Douglas);

飞机类型:载客飞机(Passenger Plane)和载货飞机(Cargo Plane)。


 

由于这个“转世”桥梁实际上是一个聚合关系,因此可以动态地变化。所以如果系统需要加入新的飞机种类或者飞机制造商的话,已有的各个角色不必改变,需要改变的仅仅是一个多态性的聚合关系。

注:一般而言,实现化角色中的每一个方法都应当有一个抽象化角色中的某一个方法与之相对应,但是反过来则不一定。换言之,抽象化角色的接口比实现化角色的接口宽。实现化角色则往往仅为实现抽象化角色的相关行为而存在。

 

三、      行为模式

16.       不变(Immutable)模式

一个对象的状态在对象被创建之后就不再变化。

应用举例:

java.lang.String

17.       策略模式(Strategy*

针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式把行为和环境分割开来,相当于“可插入式(Pluggable)的算法”。

策略模式的简略类图:


 

环境角色(Context):持有一个Strategy类的引用。

具体策略角色(ConcreteStrategy):包含相关算法和行为。

应用举例:排序策略系统

 

18.       模板方法(Template Method)模式*

模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。

19.       观察者(Observer)模式*

观察者模式又叫发布订阅模式(Publish/Subscribe),模型视图模式(Model/View),源监听器模式(Source/Listener)或从属者模式(Dependents)。其定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

观察者对象的简单类图:


 

20.       迭代子(Iterator)模式*

迭代子模式(Iterator)又叫游标模式(Cursor),可以顺序地访问一个聚集中的元素而不必保留聚集的内部表象。

迭代子模式的简单类图:



 

21.       责任链(Chain of Responsibility)模式*

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

责任链的简单类图:


 

22.       命令(Command)模式*

命令模式又称为行动模式或交易模式,其把一个请求或者操作封装到一个对象中,命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

命令模式的简单类图:


 

23.       备忘录(Memento)模式*

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

备忘录模式的简单类图:


 

备忘录角色(Memento),发起人角色(Originator),负责人角色(Caretaker)

24.       状态(State)模式*

状态模式又称状态对象模式(Pattern of Objects for States),状态模式允许一个对象在其内部状态改变的时候改变其行为,这个对象看上去就像是改变了他的类一样。

状态模式的简单类图:


 

抽象状态角色(State),具体状态角色(ConcreteState),环境角色(Context)

25.       访问者(Visitor)模式*

访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受一个操作的数据结构则可以保持不变。

26.        解释器(Interpreter)模式*

给定一个语言后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器。客户端可以使用这个解释器来解释这个语言中的句子。

解释器模式的结构:


 

27.       调停者(Midiator)模式*

调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用,从而保证这些相互作用可以彼此独立地变化。

调停者模式的简单类图:


 

抽象调停者角色(Mediator),具体调停则角色(ConcreteMediator),抽象同事类角色,具体同事类角色。

 

 

设计模式遵从的原则

1.    软件的可维护性(Maintainability)和可复用性(Reusability)

2.    -闭原则(Open-Closed PrincipleOCP):一个软件实体对扩展开放,对修改关闭。

3.    里氏置换原则(Liskov Substitution PrincipleLSP):一个软件实体如果使用的是一个基类的话,那么一定适用其子类,而且它根本不能察觉出基类对象和子类对象的区别。

4.    依赖反转原则(Dependence InversionDI):将传统的过程性系统的设计方法中倾向于使高层次的模块依赖于低层次的模块,抽象层次依赖于具体层次的原则反转过来。

5.    接口隔离原则(Interface Segregation PrincipleISP):使用多个专门的接口比使用单一的总接口要好。

6.    合成/聚合复用原则(Composite/Aggregate Reuse PrincipleCARP):在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新对象通过向这些对象的委派达到复用已有功能的目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值