责任链模式
通过前一对象记住下一个对象的引用,当有请求发生,请求将沿着这条链传递,直到有对象来处理
只需要将请求发送到责任链即可,请求会自行传递,降低对象之间的耦合
例子:三国杀中的无懈可击,循环询问是否有人使用,左轮手枪轮盘赌
优点:降低发送者与接收者的耦合,简化对象
缺点:不能保证请求一定被接收,不容易观察运行时的特征,可能会造成循环调用
命令模式
将方法的请求与实现解耦,
例子:遥控器和电视,遥控器就是命令发送者,通过具体按钮,来控制电视,电视接收到命令并执行
优点:降低系统耦合度,新命令容易添加到系统
缺点:可能会导致有过多的具体命令类
解释器模式
在软件开发中,会遇到有些问题多次重复出现,而且有一定的相似性和规律性。如果将它们归纳成一种简单的语言,那么这些问题实例将是该语言的一些句子,这样就可以用“编译原理”中的解释器模式来实现了。
例子:一些重复出现的问题可以用一种简单的语言来进行表达
优点:可拓展性好,易于实现简单的文法
缺点:使用场景较少,复杂文法难维护,会引起类的膨胀,采用递归调用方法
迭代器模式
提供一种方法顺序访问一个聚合对象中的各个元素,无须暴露该对象的内部表示
例子:遍历list
优点:支持不同方式遍历一个对象,简化了聚合类,在同一个聚合可以有多个遍历,增加新的的聚合和迭代器类都很方便
缺点:增加新的聚合类需要对应增加新的迭代器,类数成对增加
中介者模式
降低多个对象和类之间的通信复杂性,封装一系列的对象交互,不需要显示相互引用,使其耦合松散,可以独立改变交互
例子:机场调度系统,mvc框架,C控制器就是M模型和V视图的中介者
优点:降低了类的复杂度,将一对多转化为一对一,各类之间的解耦,符合迪米特原则
缺点:中介者会庞大,维护困难
备忘录模式
在不破坏封装的前提下,保存一个对象的某个状态,可以在以后将对象恢复到保存的状态。
例子:后悔药,玩游戏时候存档
优点:提供了后悔的机会,可以很方便的回到某个状态
缺点:消耗资源,如果类的成员变量过多,会占用较大的资源
观察者模式
当一个对象被修改时,自动通知依赖他的对象,并被自动更新
例子:拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者
优点:观察者和被观察者是抽象的耦合,建立一套触发机制
缺点:如果一个对象有很多直接或间接观察者,通知所有的观察者会花很多时间,如果观察者和观察目标有依赖的话可能导致系统崩溃,没有相应的机制知道被观察者是如何变化的只知道发生了变化
状态模式
类的行为基于状态改变,对象的行为依赖于它的状态,根据它的状态改变而改变它的行为
例子:打篮球时候运动员可以有正常状态,不正常状态,超常状态
优点:封装了转换规则,枚举可能的状态,可以多个环境对象共享一个状态对象,
缺点:增加系统类和对象的个数,状态模式结构与实现复杂,容易使程序结构和代码混乱,对开闭原则支持不好
空对象模式
主要为了解决空指针异常,使用在需要检查空值的地方
策略模式
一个类或算法可以在运行时更改,定义一系列算法,把他们封装起来,并使他们可以相互替换,解决多种算法时候的if_else
例子:旅行时的出游方式,选择骑自行车,坐汽车,每种方式都是一个策略
优点:算法可以自由切换,避免使用多重条件判断,拓展性良好
缺点:策略类会增多,所有策略类都需要对外暴露
模板模式
一个抽象类公开定义了执行它的方法的方式,它的子类可以按需重写方法实现,调用将以抽象类中定义的方式进行
例子:造房子,地基,框架都是一样的,后期的装修是不同的,西游记中定好的81难
优点:封装不变部分,拓展可变部分,便于维护,行为由父类控制,子类实现
缺点:不同的实现都需要一个子类实现,导致类的个数增加
访问者模式
将数据结构与数据操作分离,对一个对象结构进行很多不同的操作
例子:到朋友家做客,朋友接收访问,通过朋友的描述,对朋友的描述做一个判断
优点:符合单一原则,优秀的拓展性,灵活性
缺点:对访问者公布具体细节,违反迪米特原则,具体元素变更困难,违反了依赖倒置原则,依赖的具体类,没有依赖对象