定义 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。 动机 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。 如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变? 结构 要点 Builder 模式主要用于“分步骤构建一个复杂的对象”。在这其中“分步…

2018年4月4日 0条评论 3941点热度 0人点赞 icebmji 阅读全文

定义 使用原型实例指定创建对象的种类,然后通过拷贝这些原型对象来创建新的对象。 动机 在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一致的接口。 如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离出“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变。 结构 要点 Prototype模式同样用于隔离类对象的使用者和具体类型(易变类)之间的耦合关系,它同样要求这些“易变类”拥有“稳定的接口”。 Prot…

2018年4月4日 0条评论 3370点热度 0人点赞 icebmji 阅读全文

定义 提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类。   动机 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“多系列具体对象创建工作”的紧耦合? 结构 要点 如果没有应对“多系列对象构建”的需求变化,则没有必要使用 Abstract Factory模式,这时候使用简单的工厂完全可以。 “系列对象”指的…

2018年4月1日 0条评论 3215点热度 0人点赞 icebmji 阅读全文

定义 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。 动机 在软件系统中,经常面临着创建对象的工作;由于需求的变化, 需要创建的对象的具体类型经常变化。 如何应对这种变化?如何绕过常规的对象创建方法(new),提供一 种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧 耦合? 结构 要点 Factory Method模式用于隔离类对象的使用者和具体类型之间的 耦合关系。面对一个经常变化的具体类型,紧耦合关系(new…

2018年4月1日 0条评论 2867点热度 0人点赞 icebmji 阅读全文

定义 将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。 动机 由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度, 乃至多个纬度的变化。 如何应对这种“多维度的变化”?如何利用面向对象技术来使得 类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂 度? 结构 要点 Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固 有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓 抽象和实现沿着各自纬度的变化,即“子类化”它们。 Bridge模式有时候类似于多继承方案,…

2018年3月30日 0条评论 2862点热度 0人点赞 icebmji 阅读全文

定义 动态(组合)地给一个对象增加一些额外的职责。就增加功 能而言,Decorator模式比生成子类(继承)更为灵活(消 除重复代码 & 减少子类个数)。 动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性; 并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展 功能的组合)会导致更多子类的膨胀。 如何使“对象功能的扩展”能够根据需要来动态地实现?同时避 免“扩展功能的增多”带来的子类膨胀问题?从而使得任何“功能 扩展变化”所导致…

2018年3月29日 0条评论 2482点热度 0人点赞 icebmji 阅读全文

定义 定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。 动机 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关 系” ——一个对象(目标对象)的状态发生改变,所有的依赖对 象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密, 将使软件不能很好地抵御变化。 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定 的依赖关系。从而实现软件体系结构的松耦合。 结构 要点 使用面向对象的抽象,Observer模式使得我们可以…

2018年3月29日 0条评论 3102点热度 0人点赞 icebmji 阅读全文

定义 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化) 动机 在软件构建过程中,某些对象使用的算法可能多种多样,经常改 变,如果将这些算法都编码到对象中,将会使对象变得异常复杂; 而且有时候支持不使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算法?将算法与对象本 身解耦,从而避免上述问题? 结构 要点 Strategy及其子类为组件提供了一系列可重用的算法,从而可以使 得类型在运行时方便地根据需要在各个算法之…

2018年3月27日 0条评论 3064点热度 0人点赞 icebmji 阅读全文

定义 定义一个操作中的算法的骨架 (稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。 动机 在软件构建过程中,对于某一项任务,它常常有稳定的整体操作 结构,但各个子步骤却有很多改变的需求,或者由于固有的原因 (比如框架与应用之间的关系)而无法和任务的整体结构同时实现。 如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变 化或者晚期实现需求? 结构 要点 Template Method模式是…

2018年3月26日 0条评论 3180点热度 0人点赞 icebmji 阅读全文

GOF角度模式分类 创建型(Creational)模式:将对象的部分创建工作延迟到子 类或者其他对象,从而应对需求变化为对象创建时具体类型实 现引来的冲击 结构型(Structural)模式:通过类继承或者对象组合获得更灵 活的结构,从而应对需求变化为对象的结构带来的冲击 行为型(Behavioral)模式:通过类继承或者对象组合来划分 类与对象间的职责,从而应对需求变化为多个交互的对象带来 的冲击 从封装变化角度对模式分类 组建协助: Template Method Observer / Event Strate…

2018年3月26日 0条评论 2259点热度 0人点赞 icebmji 阅读全文
12