设计模式总结(待完善)

1.AbstractFactory
AbstractFactory意味着具体的Factory实现有多种,但创建方法都是一致的,最终的结果是每个Factory实现能够生产出一套具体的实例。

以一汽大众为例,它下面有多条生产线,比如高尔夫,迈腾,宝来等等,每辆车都要生产车门,座椅,底盘,等等部件。AbstractFactory封装生产这些部件的行为,而具体的生产线就是一个Factory实例,分别执行这些行为。

AbstractFactory很多情况下和FactoryMethod结合使用。

2.Adapter
Adapter一般用在需要转换行为或者数据格式的场景上,其本身持有被调用的实例,开放一些方法供调用者,并且在这些方法中做一些数据转换或者其他的事情。

以手机充电为例,家用电220v交流电,直接给手机充不行,我们一般会有一个带变压器的充电器,它将220v交流电转换成了符合手机充电电压的直流电给手机,这个带变压器的充电器就相当于Adapter,它持有220v的交流电实例,而调用方就是手机。

3.Bridge
Bridge模式意在将抽象和实现分离,抽象的实现会持有一个具体执行者的实例,并且这个实例是可变的,当调用方调用抽象的方法时,抽象实现会执行当前具体执行者对应的方法。这个实际上是将原本抽象与具体执行者的继承关系分解成了聚合关系(持有执行者实例),具体执行者的扩展和抽象没有了强关联。

4.Builder
Builder模式主要用在复杂对象的构建上,接口封装构建每一个部分的方法(当然也可以只有一个方法),并且提供一个返回最终构建完成对象的方法。一个标准Builder会持有被构建的对象实例。

5.ChainOfResponsibility
ChainOfResponsibility将行为分解成一个个Handler,每一个Handler会针对数据执行自己的行为,并且将处理后的数据向下一个Handler传递,直到完成。

6.Command
Command模式根据具体的指令,选择适当的行为进行触发,行为封装成一个个Command。
Command模式和Observer模式有点像。

7.Composite
Composite模式中,各个对象都会有实现相同的接口,但是不同对象按照自己的角色实现不同的方法以及在相同的方法中实现不同的逻辑。

以构建一颗树为例,抽象为Node,里面定义有getChildren和getParent方法和display方法,root节点getParent返回空,leaf节点getChildren为空,branch节点两个方法都实现。root节点和branch节点display方法中除了打印自身值同时调用children的display方法,leaf节点只要打印自身的值即可。

8.Decorator
Decorator中,相同一组的对象有相同的行为定义,并且从低向上,低一级的对象持有上上一级的对象,每一级在相同行为中执行自己的方法,并且调用上一级的方法。调用者越调用低级的对象行为,具有越丰富的特性。这个模式和ChainOfResponsibility的区别在于后者会对数据进行挑选处理,而前者进行一级一级包装完全是为了添加上每一级的行为和数据。

9.Façade
Façade往往用在后端有很多复杂而分散的行为定义并且避免外部调用方直接调用分散在多个类里面的行为的场景下,它统一使用一个(或者几个明确的)Facade类封装后端所有的行为,façade类里面持有和管理后端行为的实例。

10.FactoryMethod
创建不同具体种类的实例,实例源于相同接口定义。比如生产高尔夫和迈腾的车门分别属于不同的factory,但是这两种车门都是车门的一种。

11.Flyweight
Flyweight模式就是创建和缓存对象实例。需要有返回具体某一个实例的方法。

12.Interpreter
Interpreter 模式定义一组解释器,这些解释器具有相同的行为定义,进行不同的逻辑执行,应对相同类型的数据。主要是将数据和行为分离,数据可以按照自己的接口定义变化,执行行为可以单独扩展。

13.Iterator
Iterator模式主要是通过一个相同的迭代接口(比如定义了next,isDone,currentItem,first等方法)对既有的容器进行遍历等操作。主要避免了让调用方直接调用各种各样容器的遍历方法(比如数组和ArrayList的遍历区别),以至于后续变动容器种类必须动调用代码。迭代接口的实现一般持有容器的实例,通过调用容器的getCount,get(index)等方法实现接口里面定义的遍历方法。

14.Mediator
Mediator模式主要用在多对多互相调用(调用方法一致)的场景上。Mediator实现类持有所有这些对象实例并且知道相互调用逻辑,当一个对象的方法被调用时,改对象直接调用Mediator的中介方法,中介方法根据相互调用逻辑,调用对应对象的响应方法。

线上聊天就是一个很好的案例,当两个人(比如A,B)建立聊天开始时,生成一个Mediator,A想发送MSG1给B,它直接把MSG1发给Mediator的中介方法,这个方法中将MSG1发送给除A本人外的其他人,也就是B,B收到消息。多人聊天也一样。

15.Memento
Memento模式,也称为备忘录模式,作用是保存对象的状态,并在需要的时候恢复对象的状态。这个模式相对比较简单,它有一个Originator(原生者),就是需要被保存状态以便恢复的那个对象;一个Memento对象,这个对象主要是保存原生者的状态,并在适当的时间恢复到原生者里去。而这个适当的时间就是由CareTaker(管理者)来决定的。

在现实中的应用最常见的就是实现系统的Undo操作了。

16.Observer
Observer模式中,被观察的对象中会注册一个或者多个Observer,当被观察对象中发生行为时,对应注册的Observer会被依次调用。这个模式和Command模式有点像。

17.Prototype
原型模式主要是为了创建copy一个对象并且带有其数据,并且隐藏其中拷贝的细节。原型实现类自己带有自我复制的方法。

18.Proxy
Proxy持有被代理类的实例,并且实现了和被代理类相同的接口方法。调用方执行的时候,直接调用Proxy相应的接口方法,而Proxy则会在这个方法中加入一些自己的逻辑,比如打日志之类的事情,当然会调用持有实例的对应方法。

19.Singleton
单例的类将自己的构造方法设成了private,自己持有自己的实例,并且对外提供一个方法返回持有的实例,所以这个实例一直是相同的。

20.State
State模式中,宿主持有一个State实例,并且定义一些行为,State实例持有对应的数据和方法。当宿主的行为被调用时,宿主会主动调用State实例对应的方法进行具体的数据操作,而State实例在操作完成后会检查当前的数据是否满足状态变更条件,如果满足,主动创建另外一个对应State实例,并且将这个实例设为宿主新的State实例,自己消亡。这样就达到了状态的变迁。

21.Strategy
Strategy的各个实现类定义有相同的方法,做出不同逻辑行为。业务实例根据不同的条件持有不同的Strategy实现类实例,被调用方法时,业务实例直接调用持有的Strategy实例中的方法。

22.TemplateMethod
抽象类定义几个抽象行为方法,并且定义一个方法进行这些抽象方法的调用,子类只要实现这些抽象方法即可。即实现了各个行为的调用顺序,开放各个行为的具体实现。

23.Visitor
Visitor模式中,被访问对象accept一个特定visitor,并且调用这个visitor相应的方法。由被访问对象决定具体执行那些行为并且将自身数据暴露给这个方法,visitor本身只是定义了一系列的行为,它无法决定到底调用哪个方法。

你可能感兴趣的:(设计模式)