对设计模式的一些理解【供参考】

一、创造型模式

1. 工厂模式:

此模式主要就是将现实生活中的场景拉进来。现实生活中,假设你要买一台台式机,你可以有两种选择:要么所有组件都自己买,买回来之后自己再组装成台式机;要么你可以“挂代理”,直接叫代理人(相当于工厂角色)说我要什么样型号的台式机。那么代理就会帮你组织联络生产,若干天后返回给你的就是一台整机。所以,利用代理可以屏蔽产品制造的细节,表面看上去get一下就好了。

2. 抽象工厂模式

我个人更倾向于将这个模式称为超级工厂模式,因为这样似乎更能体现模式的本质?这个模式实际上就是把工厂的生产对象,由产品改成工厂。考虑这样子的一个问题:现在我要买一块AMD的芯片和一块Intel Core i9的芯片,如果是用工厂模式,那么我就要自己跑路,去AMD公司和Intel公司各购买一块芯片。但是现在使用抽象(超级)工厂模式,我只需要将我的需求(那两块芯片)提交给超级工厂(超级工厂只有一个),超级工厂将AMD公司和Intel公司的联系方式给我,我打电话过去叫他们生产就可以了。流程其实和工厂模式是相像的,只不过现在经过超级工厂来处理。

3. 单例模式

单例模式实际上就是不把构造方法向外暴露,为private。这个有点像技术绝活。就像你去微软那里,你想要买一个定制的windows操作系统,但是微软肯定不会把windows设计的代码给你让你自己去编译成windows操作系统再使用。微软内部肯定先把系统编译好,然后直接拿给你使用,并且只卖给你,不卖给别人。

4. 建造者模式

建造者模式在一定程度上与工厂模式方法有共同点。可以这么来理解:我现在想要买一辆雪佛兰汽车,那么我直接把车的型号告诉给车工厂,工厂把我的需求一一记录下来,然后就开始寻找合适的元件进行组装。这个装配的过程比较讲究顺序,完了之后,工厂直接把整车交付给我。

5. 原型模式

这个模式可以这么来理解:像抖音这样的短视频,总有一些热度很大的视频。现在假如你是第一个观看这类视频的人,那么服务器在把视频返回到你终端的时候,顺便在服务器的缓存池缓存了这个视频,因为它知道这个视频在未来的一段时间内还会有很多人访问。现在,假设我也访问了这个视频,那么,服务器只需要直接把缓存池里面这个缓存的视频直接返回给我,而不需要再从二级存储进行文件调度,这样就极大地提高了服务器的I/O效率。

二、结构型模式

1. 适配器模式

这种设计模式意在解决类类型兼容的问题。假如你现在的华为M5平板想要“变成”一部移动笔记本,且假设你现在只有有线鼠标和有线键盘,当然你还想接耳麦(小孔状的耳麦口)。那么你需要接入一个转换器(这个转换器就是适配器),转换器包含了各式各样的接口(包括USB 2.0 | USB 3.0… etc)。那么这个转换器实际上就是实现了所有这些接口的功能,只要平板插上这个适配器,就可以实现笔记本一样的硬件体验功能。

2. 桥接模式

假设现在有一个电动机马达,如果装上滚筒,就成为了洗衣机;如果装上扇叶,就变成了电风扇。可见,电风扇与洗衣机其实差别只在于装在马达上的机械不同,其核心马达是相同的。马达就是这两个类的桥接。通过这个桥接,可以很容易的拼装出洗衣机和电风扇,甚至实现洗衣机向电风扇的改装。

3. 过滤器模式

所谓过滤器模式,顾名思义,其实就是对数据进行过滤操作,以得到我们想要的结果。而过滤的需求,我们称之为标准,就是按照某个标准对数据进行划分(包括并、交、差)。过滤器模式有点类似于SQL语言中的相关语句,例如像过滤出满足两个标准的数据,这是不是有点像SELECT .. FROM .. UNION SELECT .. FROM ..。过滤器模式实际上就是定义了若干个过滤器,需要对数据进行操作时,直接取对应的过滤器进行操作即可。这就实现了对象之间的解耦。

4. 组合模式

组合模式可以看做是从数据结构与算法中迁移而来。在多叉树中,我们知道在一个节点的内部其实包含了指向了众多子节点的指针,这就形成了一种森严的结构。组合模式其实就是这种树状结构的延伸,它可以清晰地表达一个组织、一个部门等的等级关系。

5. 装饰器模式

顾名思义,装饰器模式其实就是为装饰类而设计的。给你一个模型,你可以交给装饰器模式,让他帮你染红,染绿等等一系列附加值操作。

6. 外观模式

外观模式初次接触起来有点类似于工厂模式,但与工厂模式不同的是,工厂模式有需求才生产,而外观模式内部都已经实例化了各组件。举个例子,你买了个台式机,你总不希望他给你的是一个机壳或者一大堆零件让你组装,这些情况都过于极端。一般,我们买来都是一个整机,机箱后面提供了各式各样的接口,我们连线就可以直接使用了。这个机箱,扮演的就是外观的角色,它隐藏了机内复杂的的逻辑和细节。

7. 享元模式

享元,拆开来理解就是共享对象,这个模式有利于减少对象数量的增长,缓解内存的压力。就好比在学校里面学习某一门课,需要买书。懂经济和环保意识的人,会先到图书馆或旧书屋,看看有没有可以重复利用的书籍。如果不管三七二十一就买书,不仅浪费了金钱,还不利于环保事业。

8. 代理模式

代理模式,顾名思义就是将某些操作交给代理人(中介,Proxy)来完成。比较合适的例子是计算机的层次存储结构:我们知道,运行的程序访问内存上的数据时,数据需要从内存转移到cache,再从cache转移到CPU上的寄存器中。那么,对于CPU上的寄存器来说,cache就是其取数据的代理。当代理没有数据的时候,代理会去找数据再返回给寄存器;如果代理发现它缓存有数据,那么可以直接返回数据给寄存器。

三、行为型模式

1. 责任链模式

理解起来有点像踢皮球模式,意思就是说如果当前对象处理不了用户发过来的请求,那么当前对象会把这个request发送给下一个责任人,直到请求被处理为止。可以与面向对象中的异常传递链做类比。

2. 命令模式

命令模式,其实就是发号施令,叫别人代做事情。假设现在你想要买一个新的电视机,同时把旧的电视机卖出去。那么,你可以叫两个人(小A和小B)帮你跑腿,他们并不知道对方的任务(收到的命令),只知道把自己手头上的任务完成。

3. 解释器模式

给定一个文字描述,利用解释器模式,可以从中抽取出一些文字特征,返回用户相应的询问结果。这种模式用得相对较少。

4. 迭代器模式

迭代器模式应该是最熟悉的了,C++和Java等面向对象的语言中都有迭代器的概念。迭代器提供了一种无需暴露对象内部逻辑的遍历方式。

5. 中介者模式

计算机网络中,路由是一种非常重要的存储转发设备,A主机要给B主机发送一段报文,A与B之间并不能够直接通信,报文(或者一段一段的分组)必须经过路由才能实现数据之间的交互,路由器在这里充当的就是中介者的角色。

6. 备忘录模式

可以结合操作系统中有关线程的知识来理解。我们知道,在现代操作系统中,一个进程往往包含若干个线程,这些线程并不全是同时执行,更普遍的情况是线程之间轮流获得CPU时间片执行。那么,在一个线程被挂起时,为了下一次执行依然能有正确的数据(如寄存器数据),相关信息必须被保存下来。备忘录模式就可以将相关的对象临时保存起来,在下一次用到的时候直接返回给用户。

7. 观察者模式

观察者模式其实就是一个通知-广播模式。考虑这样的情形:在操作系统中,我们知道可能存在线程不安全的情况。譬如A线程代码会修改x变量,而恰好在修改之前一刻A线程被挂起(x没有被修改),这时B线程也会修改x变量,x变量修改完之后B线程被挂起,之后A再次引用x变量,但这时的x变量已经不是A被挂起之前的x。这么引用就会带来线程不安全的问题。解决这个问题就是使用观察者模式,当B线程修改了共享区的x变量之后,自主发出一个通知(notify),通知其他线程这个变量在我这儿被修改了,你们后续要怎么决定你们自己考虑。这就是观察者模式,通常用在一对多关系上。

8. 状态模式

在状态模式中,类的行为是基于它的状态改变的。打个比方,人类对象到了夏天,其wearing行为是穿上短袖,而到了冬天,wearing行为是穿上棉袄。是什么影响人类对象的呢?很明显是气候更替。在状态模式中,我们创建表示各种状态的对象(在本例中就是不同气候),和一个行为随着状态对象改变而改变的 context 对象(在这里就是人类对象)。

9. 空对象模式

在空对象模式中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。在空对象模式中,我们创建一个指定各种要执行的操作的抽象类和扩展该类的实体类,还创建一个未对该类做任何实现的空对象类,该空对象类将无缝地使用在需要检查空值的地方。

10. 策略模式

在策略模式中,一个类的行为或其算法可以在运行时更改。打比方,我现在有一个实现了加减乘除的计算器,我只需要喂两个数给它,同时指定一下运算符,那么计算器就自动帮助我完成计算。在策略模式中,我们创建表示各种策略的对象(在例子中就是加减乘除四则运算),和一个行为随着策略对象改变而改变的 context 对象(在本例中指的就是计算器)。策略对象通过改变 context 对象的执行算法,完成相应的功能。

11. 模板模式

模板模式其实非常好理解,主要用到了在JavaSE中学习的继承机制:一个抽象类公开定义了执行它的方法的方式/模板;它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。模板模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

12. 访问者模式

简单理解访问者模式:假想有一种不良代码植入某计算机上,对各个文件做遍历(访问)。从文件角度来说,就是每个文件都接受了一个访问者(本例中是不良代码),访问者对文件进行信息读取之后,进行后续的一系列操作。通过这种方式,元素的执行算法可以随着访问者改变而改变。

欢迎同步关注:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值