美文网首页GoF设计模式
GoF基础设计模式(Head First篇)

GoF基础设计模式(Head First篇)

作者: _Walker__ | 来源:发表于2021-11-01 23:24 被阅读0次

    策略模式

    定义了算法族,分别封装起来,让它们之间可以互相替换。
    此模式让算法的变化,独立于使用算法的客户。

    观察者模式

    定义了对象间的一对多依赖,当一个对象(Subject)改变状态时,它的所有依赖者(Observer)都会收到通知并自动更新。

    • 观察者是对象间的关系
    • 观察者需要依赖主题对象,而非一个简单的事件!!
    • 有多个观察者时,不能依赖特定的通知顺序
    • 数据更新,有推(Push)、拉(Pull)两种方式(推被认为更合理)

    装饰者模式

    动态地将责任附加到对象上。
    拓展功能,装饰者提供了比继承更有弹性的替代方案。

    • 装饰者会导致设计中出现很多小对象,若使用过度会让程序变得复杂
    • 装饰者(Decorator)继承自组件(Component),其目的是“类型匹配”,而不是继承“行为”
    • 每个装饰者应该是独立的,不应该去感知是否有其他的装饰者存在
    • 意图:追加责任(不改变接口)

    单例模式 (Singleton Pattern)

    确保一个类只有一个实例,并提供一个全局访问点。

    命令模式(Command)

    将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。
    命令模式也支持可撤销的操作。

    • 命令模式将调用者和执行者解耦
    • 命令可用来实现日志和事务系统
    • 通常命令只是简单的调用执行者的接口,但“聪明”但命令对象,可以直接实现请求,而不是将工作委托给执行者
    • Command是回调机制的一个面向对象的替代品

    适配器模式

    将一个类的接口,转换成客户期望的另一个接口。
    适配器让原本接口不兼容的类,可以合作无间。

    • 适配器就是组合(composition)原对象,然后实现(implement)目标接口
    • 适配器模式分为类适配器与对象适配器,其中类适配器采用多继承机制实现,故常用的是对象适配器
    • 意图:转换接口

    外观模式 (Facade Pattern)

    提供了一个统一的接口,用来访问子系统中的一群接口。
    外观定义了一个高层接口,让子系统更容易使用

    • 外观通过增加类,来减少依赖(将客户从组件的子系统中解耦)
    • 意图:简化接口
    • 外观并不定义新功能
    • 外观是单向的,子系统内部并不知道Facade的存在

    模版方法模式

    在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。
    模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

    • 工厂方法是模版方法的一种特殊版本
    • 策略与模版方法都封装算法,前者用组合,后者用继承

    迭代器模式

    提供一种方法,顺序访问聚合对象(集合)中的各个元素,而又不暴露其内部的实现

    • 迭代器的“顺序访问”并不意味着“有序访问”

    组合模式 (Composite Pattern)

    允许你将对象组合成树形结构来表现“整体/部分”的层次结构。
    组合能让客户以一致的方式处理个别对象以及对象组合。

    • 组合模式违背了“单一责任”原则,要管理层次结构,还要处理对象原本的责任
    • 组合模式更注重对客户的“透明”

    状态模式

    允许对象在内部状态改变时,改变它的行为,对象看起来好像修改了它的类。

    • 将状态封装成独立的类,并将动作委托给当前状态的对象
    • 新增状态,会影响上游状态的实现(上游状态要转换到新增的状态)
    • 状态的转换在内部完成,客户感知不到转换过程(客户仅和Context交互)
    • 状态转换可以由State类或Context类控制:一般,当状态转换是固定的时候,适合用Context控制;当转换更动态时,放在State中。
      决策考量:当系统进化时,应该对谁修改封闭(Context还是State)
    • 状态对象可以被多个Context实例共享(State不保存自己的数据)

    代理模式

    为另一个对象提供一个替身或占位符,以控制对这个对象的访问

    使用Proxy模式常见情况:

    • 远程代理(Remote Proxy):控制访问远程对象
    • 虚代理(Virtual Proxy):控制访问“创建开销大”的对象
    • 保护代理(Protection Proxy):基于权限,控制对资源的访问
    • 智能引用代理(Smart Reference Proxy):当主题被引用时,进行额外的动作。如:引用计数、首次加载

    用模式思考

    1. 保持简单(Keep It Simple/KISS)
      设计目标是用最简单的方式解决问题,而不是如何使用模式
    2. 设计模式非万灵丹;事实上,连什么丹都算不上!
      模式是解决一再发生的问题的通用方案
      每个模式有其适用范围,不是所有问题都能用模式解决
    3. 知道何时需要模式
      设计时,如果确定在设计中可以用某个模式解决某个问题,那么就用它;
    4. 重构的时间就是模式的时间!
      重构的目标是改善其结构,而不是行为。这个过程正适合引入模式。
    5. 拿掉你所不需要的,不要害怕将一个设计模式从设计中删除
      当系统变的非常复杂,并且并不需要预留弹性的时候,就不需要使用模式
    6. 如果你现在不需要,就别做!!
      避免过度设计

    相关文章

      网友评论

        本文标题:GoF基础设计模式(Head First篇)

        本文链接:https://www.haomeiwen.com/subject/ypxraltx.html