设计模式速览
设计模式是软件开发领域多年来的经验总结以及最佳实践,使用设计模式不仅可以让我们编写可重用的底层代码,更有助于构建一个稳健可靠的整体系统架构。
设计模式与面向对象编程和 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
- nginx+tomcat单个域名及多个域名配置
- bootstrap源码分析之tab(选项卡)
- bootstrap源码分析之scrollspy(滚动侦听)
- volatile
- 用最简单的图文带你看懂区块链
- 微信小游戏正式上线!小程序的一个类目,即点即玩!
- CentOS7安装GitLab、汉化、邮箱配置及使用
- Bootstrap源码分析之transition、affix
- Redis从单机到集群,一步步教你环境部署以及使用
- C++内存管理学习堆和栈
- 人人公司宣布收购美国卡车社区平台Trucker Path
- Mysql字符串截取总结:left()、right()、substring()、substring_index()
- c++程序的内存格局
- SpringMVC中利用@InitBinder来对页面数据进行解析绑定
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- python第四十三课——封装性
- Nginx+Tomcat多实例及负载均衡配置
- python第四十四课——继承性之单继承
- python第四十五课——继承性之多重继承
- Linux系统——keepalived高可用集群服务
- python第四十五课——继承性之多继承
- HTTP服务器Nginx服务介绍续
- python第四十六课——函数重写
- Linux系统Memcached服务介绍
- python第四十七课——类属性和函数属性
- python第四十八课——类函数和对象函数
- python第四十九课——对象序列化与反序列化
- python第五十课——多态性
- python第五十一课——__slots
- Linux系统安全配置iptables服务介绍