设计模式速览

时间:2022-07-22
本文章向大家介绍设计模式速览,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

设计模式是软件开发领域多年来的经验总结以及最佳实践,使用设计模式不仅可以让我们编写可重用的底层代码,更有助于构建一个稳健可靠的整体系统架构。

设计模式与面向对象编程和 Java 语言实践密切相关,但其中心思想却是可以被广泛借鉴的,不论使用的是哪种编程语言。另外,我相信即使你之前并不了解设计模式的相关概念,但在你的实践过程中仍然或多或少的使用到了它。

设计模式可以分为三种类型:创建型、结构型、行为型,它们分别关注对象的创建、结构、行为。

01

创建型模式

创建型模式重点关注的是对象的创建即实例化过程。

1、Singleton

单例模式。一个类只能有一个实例,并且可以全局访问。

2、Factory

工厂模式。工厂可能是一种函数或方法,其产出的产品就是实例化的对象。比如 new 。工厂有简单的、也有复杂的,因此也可以详细分为 simple factory 简单工厂模式(也称为静态工厂模式)、factory method 工厂方法模式、abstract factory 抽象工厂模式。

3、Builder

建造者模式。使用多个简单的步骤一步一步构建复杂的对象。

比如一份 KFC 套餐可能由主食、小吃、饮料构成,那么这个复杂的套餐对象可以表示为:

new KFC('套餐').add('主食').add('小吃').add('饮料').build()

4、Prototype

原型模式。通过克隆一个已存在的对象从而创建一个新的对象。

02

结构型模式

结构型模式关注的是如何将类或者对象结合在一起形成更大的结构,就像搭积木一样,通过简单积木的组合去形成一个复杂强大的结构。

1、Adapter

适配器模式。你的笔记本是 typeC 接口,而显示器却是 HDMI 接口,这时候怎么办?接一个适配器呗,适配器的作用就是不改变原来的接口,让它们仍然能够对接成功。

2、Bridge

桥接模式。假设你的网站具有三个页面和三种不同的主题色彩,页面与主题设计呢,每一页面都挂载三种主题吗,如下图:

这样,页面和主题相互耦合,当某一个页面或主题发生变化时则很麻烦,因此我们可以将页面和主题分开:

然后通过桥接的方式,将它们组合在一起。

3、Composite

复合模式。把一组相似的对象当成一个单一对象。比如某个组织的人员可能有不同的职责、职级、或者下属,但是他们构成了单一的组织。

4、Decorator

装饰器模式。不改变对象的结构,通过添加装饰器的方式,为对象增加额外的功能。比如 @ 方法。

5、Facada

外观模式。隐藏内部的复杂性,对外提供一个简单的接口。比如,电脑如何关机?答案是点击关机按钮。这里的关机按钮是一个简单的对外展示,而实际关机的一系列复杂动作比如关闭进程、保存文件等等都被隐藏在了内部。

6、Flyweight

享元模式。通过共享的方式避免对象的重复创建。比如,你想要买一杯豆浆,商家会一杯一杯的去打磨制作吗,显然不会,他会事先制作好一大桶豆浆,你需要一杯则直接给你装一杯就好了。

7、Proxy

代理模式。给某个对象提供一个代理,通过代理控制对原对象的引用。

03

行为型模式

行为型模式重点关注的是对象之间的相互作用。

1、Chain of Responsibility

责任链模式。链式处理对象。比如,我有微信、支付宝、银行卡三种支付方式,当我要付款时则先检查微信时的钱够不够,如果够则支付完成,如果不够,则去检查支付宝的钱够不够,够就支付完成,不够就去检查银行卡。

2、Command

命令模式。调用者发出命令,命令传递给接受者,接受者执行。比如,你在餐厅吃饭,首先你发出了命令即点菜,然后,菜单通过服务员传递给了厨师,厨师最后制作菜品。

3、Iterator

迭代器模式。它提供了一种访问对象元素,但是又不暴露底层表示的方法。比如,我们并不知道收音机所有的频道,但是可以通过上一个频道、下一个频道这样的方式去访问具体的频道。

4、Mediator

中间人模式。通过一个中介对象来封装一系列的对象交互,而各个对象之间不需要显示的相互引用。比如,你通过手机与另一个人交谈,你说的话并不是直接发送给对方的,而是通过网络服务商作为中间人转达。

5、Memento

备忘录模式。在对象的外部记录对象的状态。比如某些游戏的存档。

6、Observer

观察者模式。就像发布-订阅或者监听器一样,某个事件被触发了,观察者就会接收到通知。

7、Visitor

访客模式。不修改对象结构向其添加新的操作。

8、Strategy

策略模式。让算法独立于使用者而变化。比如冒泡排序对于小数据集效果更好,而快速排序对于大数据集效果更好,为了解决这个问题,我们就使用了一种策略,当输入是小数据集时使用冒泡排序,反之使用快速排序。

9、State

状态模式。允许一个对象在其内部状态改变时改变它的行为。比如,你使用画布程序画图,当你的画笔颜色是红色时,其行为是红色绘画,当颜色为蓝色时,行为改变为蓝色绘画。

10、Template Method

模板方法模式。定义具体的模板,在模板的基础上进行操作。比如,房间的骨架都是固定搭好的,但是房间内具体怎么装修布置则由你来完成。

04

结语

其实设计模式远不止上述的这些,某些例子也不一定准确,在实际应用中不同的设计模式也可能组合交织在一起。本文只是一个简述,让大家对设计模式有一个初步的贴切的了解。

参考:

https://github.com/kamranahmedse/design-patterns-for-humans

https://juejin.im/post/5cb534386fb9a0685727e1eb