设计模式-纯文字描述
设计模式在很多面试题中经常出现,同时,在写大型项目中,设计模式可以让代码更简洁,架构更合理,所以是我们必须要掌握的。
1、观察者模式
观察者模式是一种行为设计模式, 允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。一般需要以下几步:
1、定义多个 events
2、定义多个 subscribers:subscriber 继承统一的接口(比如update()方法)
3、定义一个publisher:定义subscribe 、unsubscribe、notify等方法,并且成员有一个hashmap,对应不同的event有多个subscribers。
4、定义一个类Entity,定义多个行为函数,同时成员有publisher,然后通过publisher来绑定某个event到publisher的subscribers上。
这样,当Entity有某个行为调用时,则通过publisher间接调用subscriber的update函数。
实际案例:在界面点击了一个按钮,需要多个地方同时更新或加载,这时候就需要观察者模式。
2、装饰器模式
俄罗斯套娃,可以一层层warp某个行为
实际案例:比如同一份数据,可以选择通过签名、加密、压缩等传输,一层层处理。
3、命令模式
实际案例:
1)针对客户端发来的不同类型的请求,都调用handle()函数,只是对于不同类似的请求实际的handle实现不一样。
2)我们键盘上有不同的按钮,但是对于不同的按钮,应用的处理逻辑不同。但是对于快捷键、菜单可能对应同一种行为。
3) 比如羊肉串店,客户点了鸡翅、羊肉串等多种菜,服务员接到订单后统一下发给不同的烤串员工去执行。
4、代理模式
实际案例:无法直接访问公司局域网,需要通过某台代理服务器,间接实现访问公司局域网
5、策略模式
可以通过设置不同的策略,实现不同的行为,设置的策略实际上就是接口。
实际案例:洗衣机有多个功能,不同的功能对应不同的算法实现。
6、责任链(行为型)
连接一堆的处理,定义各种 handler,将请求和处理分开
实际案例:比如某个员工请假,需要一级一级审批请假流程。或者用户购物,需要一层层验证权限、记录日志才能继续后续的购买行为。
7、原型模式
实际案例:为了获得一个同样的细胞,我们需要一个克隆技术
8、迭代器模式
依赖倒置原则,获取到迭代器,而不做具体的实现。只对外暴露一个顺序访问元素的方法。当你需要对聚合有多种遍历方式时,可以考虑迭代器模式。
优点:责任分离,把对象遍历的责任交给迭代器,让集合对象专注自己的功能;比如售票员卖票,可以从前到后卖,还可以从后到前卖。
9、中介者模式
一般用于一组对象以及定义良好但是复杂的方式进行通信的场合。
实际案例:比如两个同事不属于同一个部门,则通过一个中间人实现两个同事之间的通信;一个窗体上有很多组件,但是组件之间有错综复杂的关系。
10、享元模式
对象可以共享内部状态,而外部状态可以不同。
实际案例:很多用户需要一个网站,但是网站可能是博客、论坛,而且大多数的代码都是一样的,用户可以共享同一个实例,减少了底层存储和服务器资源。
11、访问者模式
表示一个作用于某个对象结构的各个元素的操作,它使得你可以在不改变各个元素的前提下定义作用于这些元素的新操作。
12、组合模式
定义了一种层次结构,基本对象可以组合成复杂的对象
实际案例:比如QT 中的widget,widget 内部可以添加很多子widget,子widget可以添加其他widget
13、单例模式
14、桥接模式
实现系统可能有多角度分类,没种分类都可能有变化,那么就把多角度分离出来,让它们独立变化,减少它们之间的耦合。能用组合、聚合,就少用继承。
实际案例:比如手机有多个品牌(安卓、苹果),多个品牌有多种软件(通讯录、游戏)。
参考:
https://www.bilibili.com/video/BV1uk4y127hG/?spm_id_from=333.788&vd_source=1b9978cb3a8a617140f288ca2f7659bf
https://www.bilibili.com/video/BV1614y1S7qs/?spm_id_from=333.337.search-card.all.click&vd_source=1b9978cb3a8a617140f288ca2f7659bf
《大话数据结构》-程杰
转载请注明原文链接:https://www.cnblogs.com/itfanr/p/17605092.html
公众号:小弧光黑板报