[设计模式]一两句话的设计模式

创建型

速记口诀: 单抽工建原

  • 单例:只需一个实例时考虑。要么没有,要么只有一个。
  • 工厂方法:在允许不修改工厂类的前提下添加新类。
  • 抽象工厂:当工厂方法无法满足多系列问题时,再重构为抽象工厂。提供相关性接口,无需具体指定
  • 建造者:多个部件的建造实现相同,只是所需部件、建造顺序不同时考虑。构建与表示分离。
  • 原型:在初始化信息不发生变化时考虑。重复利用现有实例的拷贝。

结构型

速记口诀:桥代理组装适配器,享元回家装饰外观。

  • 适配器:让接口不相容的类能协同工作。解决新旧共存的问题。
  • 装饰:对象动态添加职责。动态增加单个对象的额外职责,比生成子类更灵活。利用装饰者类重复传入装饰对象,可以随意增减装饰方法。替代继承方式解决类膨胀问题,扩展性极强。应用场景:源码:ContextWrapper ,餐馆混搭,奶茶混搭
  • 桥接:注重接口和实现的分离,注重多维度的变化。使继承关系更改为组合关系,使两者可独立变化。实现与抽象解耦。
  • 组合:简单复杂等同操作。注重将一对多转换为一对一,树型结构层次的关系。用树状结构表示“整体-部分”的层次关系,使单个对象(叶节点)与组合对象(枝节点)的使用具有一致性。
  • 享元:重复对象共享。为运用共享技术。使用共享对象(对象池)实现对象的复用,需要分离内部状态和外部状态,可以大大节约内存。应用场景:handleMessage消息池复用;线程池,建立tcp消息池 
  • 代理:控制对单个对象的访问。增加中间层次实现控制。
  • 外观:一群接口简化为一个接口。简化接口和客户端之间的调用依赖关系。

行为型

速记口诀:访问者写好策略备忘录,观察模板迭代的状态,命令中介解释责任链。

  • 观察者:一对多的监听。一对多依赖关系,一端变化、多端得到通知并自动更新。(目标与观察者可实现弱耦合)
  • 模板方法:抽象共同,具体子类具体实现。定义算法框架,使子类不改变结构的情况下改变行为。应用场景:AsynTask、Activity生命周期、draw流程
  • 命令:把行为进行抽象成命令。将请求发送者与具体实现者解耦,(多请求,单处理)。封装命令对象传递请求给调用者,分离请求者和接收者,会增加大量的类,但是职责分明,高内聚,非常灵活容易扩展,可作为回调的替代。
  • 职责链:多对象的处理。将处理者排成链,沿链传递请求。(单请求,多处理)发送请求给一个对象链条,该链条每个对象和它的下一对象绑定,实现发起者与最终接手者的解耦。应用场景:事件分发,公司各种权限的逐级申请,继承制度
  • 状态:抽象状态类简化复杂判断。当对象内状态改变而执行不同操作时考虑,状态转移逻辑不在if/switch中,而在各子类之间,增/改状态和状态转换较容易。抽象状态对象使得行为在不同状态下都能产生变化。应用场景,wifi管理,登录状态,下载状态管理
  • 解释器:若某特定问题发生的频率足够高时考虑,需定义文法表示与解释器本身。
  • 中介者:中介类封装引用。加入中介类来改变对象关系,使网状结构变为星型结构,多对多变为一对多。应用于对象关系较为复杂的情况。应用场景:Activity中view、model、逻辑交互
  • 访问者:封装对数据结构的操作。实现了访问者和被访问者分离,灵活且扩展性强;但违背了迪米特和依赖倒转原则,被访问元素若修改影响较大。细节:双分派技术(双动态绑定),访问者的角色由它的实现对象确定,被访问的角色也由它的具体对象决定
  • 策略:一系列方法的封装。将一系列算法逐个封装并可相互替换,易于切换、理解、扩展。
  • 备忘录:保存发起人内部状态。在该对象之外保存该对象的内部状态。应用场景:saveInstanceState,事务回滚 
  • 迭代器:抽象遍历集合元素。将对集合的访问与遍历从集合对象中分离出来到迭代器中。

设计模式异同对比

装饰者vs代理模式

装饰模式用作功能扩展,可以给相同对象不断增加新的特征;代理模式则偏向行为控制,在方法执行前后做处理。

状态模式vs策略模式

策略模式封装可变更的算法解耦;状态模式通过改变状态控制行为。

参考

发布了449 篇原创文章 · 获赞 180 · 访问量 87万+

猜你喜欢

转载自blog.csdn.net/ouyangshima/article/details/103647110