设计模式之个人通俗理解

参考了维基百科对设计模式的讲解,以及CSDN上的博文,对23种设计模式有了一定的了解。参考材料如下:

Java之美[从菜鸟到高手演变]之设计模式 - 智慧演绎,无处不在 - 博客频道 - CSDN.NET
设计模式 (计算机) - 维基百科,自由的百科全书
Java设计模式之实例详解_中国IT实验室_技术专题
追MM与Java的23种设计模式 - 键者天行 - 博客频道 - CSDN.NET

以下纯属个人理解,如有不恰当之处,欢迎拍砖。

创建型模式 (Creational pattern)

在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象。

1. 工厂方法模式(Factory method pattern)

交由工厂来决定生成何种具体类型的实例。

1.1.工厂“类”

工厂方法让类的实例化推迟到子类中进行。

每个工厂(Creator)生产不同的产品(Product)。比如A工厂(Concrete Creator)生产A型号手机,B工厂生产B型号手机,因此想要某型号的手机得先找到正确的工厂。

1.2. 工厂“方法”

单个工厂也可以生产不同的产品。比如C工厂既有A型号手机生产线,也有B型号手机生产线,想要手机只需告诉工厂想要的手机型号即可。
1.2.1. 普通工厂模式   一个工厂类有一个普通生产函数
1.2.2. 多个工厂方法模式 一个工厂类有多个工厂方法
1.2.3. 静态工厂方法模式 一个工厂类有多个静态工厂方法

2. 抽象工厂模式(Abstract factory pattern)

得到抽象类的引用,而不是具体类的对象引用。

如果一个工厂生产智能电视、智能手机、普通电视、普通手机4种产品(Abstract Product),则需要4条生产线。
但是如果A工厂(Concrete Factory)生产智能电视和智能手机(Product),B工厂生产普通电视和普通手机,则这两座工厂(Abstract Factory)都能够“生产电视”以及“生产手机”(createProduct)。我们(Client)想要什么产品,可以先找到合适的工厂,然后跟他说是生产手机或者生产电视即可。

3. 单例模式(Singleton pattern)

单例对象的类必须保证只有一个实例存在。
在多线程下必要时使用synchronized关键字锁定对象。

这个实在太好理解。比如美国在某个时间点只能有一位总统(Singleton),多一个都不行,副总统不算。
那第一个总统什么时候出现?总统出现之前总要有人规定总统是干嘛的,对谁负责是吧。行,如果在撰写规定的时候,规定总统按选举法产生,那么当规定生效,总统立刻就会按规定通过选举产生,此为饿汉模式。如果规定撰写完了,选举方法也定好了,OK,规定可以生效了,国家需要总统出场时(getInstance)发现还没有总统,没关系,现在执行选举产生总统的程序,总统就产生了,此为懒汉模式

4. 生成器模式(Builder pattern)

将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

顾客点了一份披萨之后,侍应(Director)来到披萨制作工具(Abstract Builder)前,根据顾客所点选的口味,选择意式披萨制作工具或者美式披萨制作工具(Concrete Builder),利用工具制作(construct)顾客想要的披萨(Product),这样顾客就能尝到侍应制作的披萨了。

5. 原型模式(Prototype pattern)

通过“复制”一个已经存在的实例来返回新的实例,而不是新建实例。

有这么一台神奇的制作曲奇的机器(Client),可以通过一块曲奇(Prototype)复制出许许多多的曲奇。既然如此,我先制作一块椰子曲奇(Concrete Prototype),放入机器,机器开始运作,然后这块曲奇开始神奇地自我复制(clone),生成的曲奇都是我制作的那块曲奇的复制品。

结构型模式(Structural pattern)

借由一以贯之的方式来了解元件间的关系,以简化设计。

6. 适配器模式(Adapter pattern)

6.1. 对象适配器模式

适配器容纳一个它包裹的类的实例。

Client不会使用Adaptee,于是Adaptor将Adaptee作为属性,Client调用Adaptor的方法,Adaptor再去调用Adaptee的方法。
其余的结构型模式均是起源于对象适配器模式。

6.2. 类的适配器模式

适配器继承自已实现的类。

Client不会使用Adaptee,于是Adaptor继承Adaptee,Client调用Adaptor的方法,Adaptor再去调用父类Adaptee的方法。

7. 修饰模式(Decorator pattern)

动态地往一个类中添加新的行为。就功能而言,修饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些功能。

假设咖啡店售卖咖啡,咖啡可以加糖可以不加糖,可以加奶可以不加奶,但是加糖或者加奶的话价格分别会增加一点,由此可以产生4种不同的咖啡,并且每种咖啡价格都不同。再者,如果咖啡可以加冰可以不加冰而且价格也因应变化的话,就会产生8种对应不同价格的咖啡。这显然很繁琐。
我们可以首先对咖啡(Component)进行定价,不同种类的咖啡,比如黑咖啡和白咖啡(Concrete Component)可以有不同的价格。然后,对不同种类的添加品(Decorator)进行定价,比如加糖(Concrete Decorator)要多少钱,加奶要多少钱。假设,顾客要一杯加糖又加奶的咖啡,则可以先制作一杯咖啡,然后对这杯咖啡加糖,然后再对这杯加了糖的咖啡加奶,从而成为一杯加奶加糖咖啡。至于价格,相应的价格加起来就行了。

8. 代理模式(Proxy pattern)

所谓的代理者是指一个类可以作为其它东西的接口。

该模式很好理解。比如我想打官司,我需要找律师。我(Real Subject)和律师(Proxy)都是人(Subject),律师可以做的事,我按理来说也可以做,但是我不会,所以请律师在法庭(Client)上代我作证或辩护。

9. 外观模式(Facade pattern)

为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。

电脑的开启是一个复杂的过程,需要依次启动CPU、内存、硬盘(Package)等。但是我(Client)不想为了开启电脑,要自己去启动CPU,启动内存,再启动硬盘。于是电脑(Façade)包含了这些部件,弄了一个开机键,我只需按下开机键,电脑就会自己去启动这一系列的部件,从而完成开机操作。

10. 桥接模式(Bridge pattern)

把事物对象和其具体行为、具体特征分离开来,使它们可以各自独立的变化。

图形(Abstraction)有很多种,有三角形有圆形(Refined Abstraction)。画图方式(Implementor)也有很多种,可以用圆规(Concrete Implementor)也可以用尺子。因而想要一个圆形的时候,就可以用圆规画出来。

11. 组合模式(Composite pattern)

把多个对象组成树状结构来表示局部与整体,这样用户可以一样的对待单个对象和对象的组合。

好了,现在我不仅仅想画圆,我想画很多个圆,几个圆组成一个图形。那么由数个图形拼成(add)的组合图形(Composite)和单个图形(Leaf)都是图形(Component),而且组合图形里面也可以包含有组合图形。

12. 享元模式(Flyweight pattern)

使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件。

有一家咖啡馆,咖啡馆里有一份菜单(Factory),菜单上列出了许多种的咖啡(Flyweight),顾客只要根据菜单来点单就行。之所以可以这样做,是因为咖啡的冲调是不会因人而异的,换句话说,一种咖啡的冲调方法对所有顾客而言都是“共享”的。

行为型模式(Behavioral pattern)

用来识别对象之间的常用交流模式并加以实现。

13. 策略模式(Strategy pattern)

对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

顾客吃完饭结账的时候,餐馆对普通顾客收取原价,而对VIP客户或者持会员卡的顾客会给予一定的折扣或者积分(Concrete Strategy),这种对不同顾客区别对待就是一种策略(Strategy)。

14. 模板方法模式(Template method pattern)

定义了一个算法的步骤,并允许子类别为一个或多个步骤提供其实践方式。

桌游(Abstract Class)基本上都有一些共通点,比如设定游戏规则,开局(摆棋、派牌),出手(出棋、出牌),当游戏结束时会产生胜利者等。当然每种桌游(Concrete Class)的具体操作和玩法会有所不同,但始终万变不离其宗。

15. 观察者模式(Observer pattern)

有时又被称为发布/订阅模式。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。

有人(Concrete Observer)喜欢订阅报纸(Subject),比如说《广州日报》(Concrete Subject),那这些人就是这份报纸的订阅者(Observer),每当有人订阅或退订的时候,报纸的订阅名单就会作相应的增(attach)删(detach)。然后派送员就会按着订阅名单去派送(notify),让订阅者接收(update)。

16. 迭代器模式(Iterator pattern)

让使用者透过特定的界面巡访容器中的每一个元素而不用了解底层的实作。

火车站的售票处前排了一条长长的队伍(Concrete Aggregate),队伍中的每个人(Concrete Iterator)顺序买票。这样,这个队伍可以看做是聚集体(Aggregate)的一种,而队伍中的每个人就可以看做是聚集体的迭代子(Iterator)。

17. 责任链模式(Chain-of-responsibility pattern)

它包含了一些命令对象和一系列的处理对象。每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。

某个员工在工作的时候,发现某个流程存在问题,得找上级(Abstract Handler),于是向部门经理(Handler)反映,部门经理发现这个问题不好处理,于是向他的上级副部长反映,副部长还不好处理,于是再向他的上级部长反映,要是部长都不能处理,那估计就得召开会议来商量处理了。

18. 命令模式(Command pattern)

尝试以物件来代表实际行动。命令物件可以把行动及其参数封装起来。

司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员(Invoker)的作用是,发出口令,口令(Command)经过传递,传到了士兵耳朵里,士兵(Receiver)去执行。

19. 备忘录模式(Memento pattern)

备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

记者在采访一位专业人士时,需要为这次采访(Originator)做一些快速的笔录(Memento),从而能够在采访结束之后根据笔录撰写采访稿。

20. 状态模式(State pattern)

让一个对象在其内部状态改变的时候,其行为也随之改变。

周末了(Context),有同学找你玩(request),你掂量了一下情况(State),发现正好没事做(Concrete State),于是答应了(handle),然后你就和同学就出去玩了。又到了一个周末,又有同学找你玩,你想起还有很多作业,于是婉拒了,然后你就继续去做作业了。

21. 访问者模式(Visitor pattern)

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

汽车出厂前需要接受(accept)检查,要将车送进检测车间(Visitor)。在检测车间,检测仪器(Concrete Visitor)会依次检测(visit)车轮、引擎、车身(Concrete Element)等各部件(Element),从而得出检测报告。

22. 中介者模式(Mediator pattern)

包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。

有一家人(Colleague)在吵架,婆婆、丈夫、媳妇(Concrete Colleague)彼此相互职责,吵得不可开交。然后你想去做和事老(Concrete Mediator),他们家人也接受你作为调停者(Mediator)。然后你就可以去了解他们各自的意见并整合,再去跟他们协商处理。

23. 解释器模式(Interpreter pattern)

给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。

有一份摩斯密码(Context),要解释它的话,你需要知道摩斯密码的代码(Expression)表。在解释(interpret)过程中,还需要按照长停顿切分出句子(Nonterminal Expression),中停顿切分出词语,小停顿切分出字符(Terminal Expression),即点和划。

你可能感兴趣的:(学习笔记)