设计模式一览

最近总有想写点东西的冲动,想来想去,总结下设计模式吧,自己写一下,不容易忘掉。
1、策略模式
所谓策略模式,是将算法和策略进行分割的一种模式。之所以这样,其实是基于一种思想,将变化的部分和不变的部分分割开来,如果以后需要修改程序,或者需求变更,只需要修改这部分变化的部分即可,如果有多种算法,相互替换即可。

典型举例:
我有前n个月份的销售记录,希望预测下一个月的销量。这种预测算法有很多,可能是时间序列算法,可能是线性回归,甚至是逻辑回归或者是随机森林(这里只是举例子,后面这3种通常来说是离线计算,可能不能用于在线)。而且可以想象,根据预测的情况,算法会随时进行调整,甚至重构。这时候把算法单独提取出来,通过一个接口来调用获取结果。就是很自然的一种设计模式,需要修改时,只需要修改接口的实现即可,增加算法重新增加一种接口的实现即可。

2、单例模式
所谓单例模式,是指一个类只有一种实例。通常该类提供一个静态方法来获取该类,另外为了保证单实例,类的构造函数需要时私有,切调用该构造函数需要加锁(经典的双重加锁)。

典型举例
比如数据库的连接池,可以做成一个单例,因为通常一个数据库只需要一个连接池即可。

3、工厂模式
所谓工厂模式,定义了一个接口来产生某个对象,但具体实例化哪个对象,则推迟到子类来实现。

经典举例
比如工厂类来生产枪,这两个都是接口。而具体的ak47工厂生产ak47,狙击枪工厂生产狙击枪。

4、抽象工厂模式
抽象工厂模式,相对工厂模式多了一层封装,通常是针对一系列对象来的。

经典举例
抽象工厂类用于武装士兵,包含枪,子弹,军服等等等等。其中的每一项都是工厂模式。因而可以理解成抽象工厂模式是工厂模式的一个组合,通常抽象工厂模式会实例化各个factory,由factory决定自己生产的是何种东西,比如是何种枪之类。

5、模板方法模式
模板方法模式,是在一个方法中定义算法的骨架和公共步骤,而将不同的步骤延迟到子类中去实现。这样的设计可以使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。

经典举例
泡茶和冲咖啡,公共部分作为模板方法。

6、观察者模式
观察者模式定义了一个对象和依赖者之间的关系,这样当对象改变状态时,它的所有的依赖者都会收到通知并执行相应动作。对象叫主题(subject),依赖者叫观察者(observer)。观察者模式的好处是主题和观察者之间的松耦合。

经典举例
下班进门后,小狗/小孩/家人都过来打招呼/拎拖鞋/求抱抱。下班回家这件事就作为主题,其他作为各个对象。

7、装饰模式
装饰模式,对已有的对象进行装饰,来扩展其功能。经典的例子比如Java的IO部分,大量使用装饰模式,将基本的InputStream扩展为各种读写接口。

经典举例
比如包装明星,将一个正常人通过嵌套各种光环,或者各种事件,使该人有非常闪光的过去 ,从而有更多的接口,比如演义事业,被狗仔偷拍.etc。

8、命令模式
命令模式,将命令封装成对象,以便支持不同的请求。可以简单理解为遥控器,传入电视命令对象,执行电视的打开动作,传入空调命令对象,执行空调的打开动作。命令模式将行为请求者和行为实现者进行解耦,而且可以方便的对行为进行扩展。

经典举例
比如模拟命令行的实现。

9、适配器模式
适配器模式,将一个类的接口转换为期望的另一个接口。

经典举例
在linux环境中执行windows程序,就需要将大量windows相关接口用适配器转换为linux的接口。

10、迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,而无需暴露其内部实现。

经典举例
集合的iterator()

11、组合模式
组合模式,将对象组合以树状结构来组织,每个节点可以是叶子节点或一颗子树,对父节点来说,他们的使用方法保持一致。

经典举例 文件夹,树状结构

12、状态模式
对象有多种状态时适用,状态不同时,相同的动作也会导致不同的结果,这时候适合适用状态模式。状态模式的好处在于容易修改和扩展,而用户不需要对状态进行感知。

经典举例
状态机。

13、代理模式
代理模式,为一个对象提供一个代理,以控制对该对象的访问。该模式的有点在于解耦,该对象内部可以很方便的进行修改,而对象的使用者不感知。

经典举例
防火墙/安全代理

14、建造者模式
建造者模式,将一个复杂的对象通过一步步简单的建造来构成。这样一步步的构造相互独立。好处在于简单易用,容易构造成复杂的结构。

经典举例
java的StringBuilder。

15、中介者模式
中介者模式,适用于多种对象间的关联,该模式将多种对象间的关联/通信更改为该对象和中介之间的通信,好处在于将多种对象之间解耦,以方便后续的维护和扩展。

经典举例
交易系统,各个商户交易较复杂,可以将所有商品委托给中介,每个人和中介来进行交流。

16、桥接模式
桥接模式,即将抽象和实现相剥离,一般为了解决多继承导致的难以维护和扩展,如果一个类需要复杂功能,可以将这些功能按模块分成多个接口,这些接口相互独立,即OCP开闭原则。

经典举例
比如各种颜色,各种形状的对象,将颜色和形状作为接口,可以防止多重继承。

17、外观模式
外观模式,讲一个子系统的功能抽象为一个接口,方便上层进行调用,而不需要了解子系统内部的复杂性。

经典举例
遥控器,按键即可,不需要了解底层实现。

18、责任链模式
责任链模式,将请求的发送者和接受者解耦,每个接受者不需要知道链的结构和其他接受者。

经典举例
比如Spring的Filter。

19、原型模式
如果创建对象的过程非常昂贵或者复杂,可以不进行创建,而对已有对象进行克隆即可(继承Cloneable,实现clone方法)。注意浅拷贝和深拷贝。

经典举例
一个对象需要给多个调用者使用,且多个调用者都可能修改其值时。使用原型模式就很合适,直接克隆出对象即可。

20、备忘录模式
在不破坏封装的前提下,捕获对象内部的状态,并在对象外部进行保存。以方便对象类进行回退操作。
对象不与备忘录类进行耦合,而与备忘录管理类进行耦合。

经典举例
游戏回退

21、访问者模式
将数据结构和数据操作进行分离。优点是容易增加新操作。缺点是破坏了组合类的封装,而且不方便修改组合结构。

22、解释器模式
给定一个语言,定义语法表示,解释器用来定义该句子的文法表示。该模式很少用。

23、享元模式
运用共享来支持细粒度的大量对象,减少内存占用,提高性能。关键点是把共同的部分抽象出来。

经典举例
JAVA的String

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值