设计模式是软件开发领域多年来的经验总结以及最佳实践,使用设计模式不仅可以让我们编写可重用的底层代码,更有助于构建一个稳健可靠的整体系统架构。
设计模式与面向对象编程和 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—
结语
其实设计模式远不止上述的这些,某些例子也不一定准确,在实际应用中不同的设计模式也可能组合交织在一起。本文只是一个简述,让大家对设计模式有一个初步的贴切的了解。