创造性模式算法
结构模式设计模式
*行为模式数组
对可重用性和可维护性设计模式的高层考虑缓存
工厂方法模式
也称为“虚拟构造器”服务器
意图:ide
何时应该使用工厂方法? ----当一个类:函数
当客户不知道要建立哪一个具体类的实例,或者不想在客户代码中指明具体建立的实例时,用工厂方法。定义一个用于建立对象的接口,让其子类来决定实例化哪个类 ,从而使一个类的实例化延迟到其子类。工具
优势:布局
潜在的缺点优化
Open-Closed Principle(OCP) - 对扩展的开放,对修改已有代码的封闭
抽象工厂模式
示例1:考虑一个用户界面工具包,它支持不一样操做系统的多个外观和感受标准:一个UI,包含多个窗口控件,这些控件在不一样的OS中实现不一样
示例2:考虑支持不一样控制系统的智能住宅的设施管理系统:一个仓库类,要控制多个设备,这些设备的制造商各有不一样,控制接口有差别
抽象工厂模式:提供接口以建立一组相关/相互依赖的对象,但不须要指明其具体类。
名称:抽象工厂(或工具包)
意图:容许独立于实现建立相关对象的家族
方法:使用工厂返回可用于建立相关对象集的工厂。
适用性
笔记
Abstract Factory建立的不是一个完整产品,而是“遵循固定搭配规则的多类产品的实例”,获得的结果是:多个不一样产品的对象,各产品建立过程对客户可见,但“搭配”不能改变。
本质上,Abstract Factory是把多类产品的工厂方法组合在一块儿
例如
GraphPoet由Word列表和WordNeighborhood列表组成
NetworkTopology由计算机/服务器/路由器列表和NetworkConnection列表组成
换句话说,Vertex和Edge的对象建立密切相关,但不该该是独立的。 Vertex和Edge的子类,要有固定搭配,不能随意组合
抽象工厂vs工厂方法
工厂方法仅用于建立一个产品,但抽象工厂用于建立相关或依赖产品系列。
工厂方法模式向客户端公开建立对象的方法,而抽象工厂则显示由这些工厂方法组成的一系列相关对象。
抽象工厂模式使用组合来将建立对象的责任委派给另外一个类,而工厂方法模式使用继承并依赖于派生类或子类来建立对象。
构造器模式
构造器模式:将复杂对象的构造与其表示分开,以便相同的构建过程能够建立不一样的表示。建立复杂对象,包含多个组成部分
示例:将文档转换为多种不一样的格式
就像你在麦当劳点餐同样!
途径
注意:客户端要的不是一堆零散的对象(抽象工厂那样的结果),而是一个完整的产品,客户端不关心其中的细节组成部分是什么,如何建立
比较:抽象工厂vs构造器
Abstract Factory建立的不是一个完整产品,而是“遵循固定搭配规则的多类产品实例”,获得的结果是:多个不一样产品的实例对象,各产品建立过程对客户可见,但“搭配”不能改变。
Builder建立的是一个完整的产品,有多个部分组成,客户不须要了解每一个部分是怎么建立,各个部分怎么组合,最终获得一个产品的完整对象
抽象工厂和构造器能够很好地协同工做,适用于多种复杂产品系列
例如
GraphPoet由Word列表和WordNeighborhood列表组成
NetworkTopology由计算机/服务器/路由器列表和NetworkConnection列表组成
换句话说,ConcreteGraph的对象建立由Vertex和Edge子类型的对象建立组成。 四个图应用都要建立图对象,要为不一样应用创建出不一样的顶点列表和边列表。
比较:模板方法vs构造器
模板方法:行为模式,目标是为了复用算法的公共结构(次序)
Builder:一种创造模式,目标是“建立复杂对象”,灵活扩展
桥接模式
适用性
结构:使用两个层次结构
对象:提升可扩展性
桥接模式是OOP最基本的结构模式,经过委托+继承创建两个具体类之间的关系(DIP依赖转置,抽象依赖于抽象)
桥接模式与策略模式
桥接:结构模式,强调双方的运行时委派链接
一个类A的对象中有其余类B的对象做为其组成部分,但A的对象具体绑定到B的哪一个具体子类的实现?在运行时经过委托加以组合,并永久保存这种代理关系。
策略:行为模式,强调一方运行时使用另外一方的“算法”
“算法”一般实现为“类的某个方法”的形式,策略模式的目的并不是在“调用算法的类”与“被调用算法所在的类”之间创建起永久联系,而只是帮助前者临时使用后者中的“算法”,前者无需永久保存后者的实例。
策略:使用螺丝刀的时候,针对不一样的工做任务,选取不一样的“刀头”,但目的并不是将螺丝刀与刀头组合起来创建永久的团队,而只是临时经过委派完成任务(即调用刀头的“算法”),而后两者再无联系。
桥接:类A须要完成“通信”功能,它有一个组成部分Device类,这是个抽象接口(模式中的实现者),有多种实现方式(PC,tablet,phone,即ConcreteImplementor),该模式在运行时为类A的具体子类型实例设定具体的Device的具体实现(强调对A和Device两个抽象类的各自实例之间如何创建委托),进而在其余各项功能中利用其通信功能(这再也不是桥接模式关注的目标)。
代理模式
代理模式动机
目标:
解决方案:
某个对象比较“敏感”/“私密”/“贵重”,不但愿被客户端直接访问到,故设置代理,在两者之间创建防火墙。
代理模式:3种类型
信息缓存(“远程代理”)
Standin(“虚拟代理”)
访问控制(“保护代理”)
代理与适配器
适配器:结构模式,目的是将类/库A的接口更改成客户端B的指望。
目的:消除不兼容,目的是B以客户端指望的统一的方式与A创建起联系。
代理:行为模式,也使用包装类,但其目的是为实际资源建立一个替身。
目的:隔离对复杂对象的访问,下降难度/代价,定位在“访问/使用行为”
组合模式
问题:
意图:将对象组成树结构以表示总体部分层次结构。
组合策略
包含菜单项的菜单,每一个菜单项均可以是菜单。
包含小部件的行列GUI布局管理器,每一个小部件均可以是行列GUI布局管理器。
包含文件的目录,每一个文件均可以是一个目录。
包含元素的容器,其中每一个容器均可以是容器。
树结构
复合vs装饰器
复合:结构模式,容许您以容许外部代码将整个结构视为单个实体的方式构建分层结构(树)。目的是在同类型的对象之间创建起树型层次结构,一个上层对象可包含多个下层对象
装饰器:结构模式,也容许一个实体彻底包含另外一个实体,以便使用装饰器看起来与包含的实体相同。强调的是同类型对象之间的“特性增长”问题,它们之间是平等的,区别在于“拥有特性”的多少,每次装饰只能做用于一个对象。
观察者模式
问题:依赖的状态必须与主人的状态一致
解决方案:定义四种对象:
“粉丝”对“偶像”感兴趣,但愿随时得知偶像的一举一动
粉丝到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝(回调粉丝的特定功能)
建模对象之间的一对多依赖关系
用法:
保持一致性的三个变体:
也称为发布 - 订阅(Publish-ubscribe)。
优势:
实施问题
访客模式
访问者模式:容许在运行时将一个或多个操做应用于一组对象,将操做与对象结构分离。 对特定类型的对象的特定操做(访问),在运行时将两者动态绑定到一块儿,该操做能够灵活更改,无需更改被访问的类
本质上:将数据和做用于数据上的某种/些特定操做分离开来。
访客与迭代器
迭代器:行为模式,用于顺序访问汇集,而不暴露其基础表示。 因此你能够在一个Iterator后面隐藏一个List或数组或相似的聚合。
迭代器:以遍历的方式访问集合数据而无需暴露其内部表示,将“遍历”这项功能委托到外部的迭代器对象。
访问者:行为模式,用于对元素结构执行操做而不改变元素自己的实现。
在特定ADT上执行某种特定操做,但该操做不在ADT内部实现,而是委托到独立的访客对象,客户端可灵活扩展/改变访问者的操做算法,而不影响ADT
策略vs访客
访客:行为模式
策略:行为模式
两者都是经过受权创建两个对象的动态联系
区别:访客是站在外部客户的角度,灵活增长对ADT的各类不一样操做(哪怕ADT没实现该操做),策略是站在内部ADT的角度,灵活变化对其内部功能的不一样配置。
中介模式
使用中央控制器是中介模式的关键方面。
经过封装不一样对象集相互交互和通讯的方式,容许松耦合。
观察者模式与中介模式
观察者模式:定义对象之间的一对多依赖关系,以便当一个对象改变状态时,它的全部依赖项都会被自动通知和更新。
一组对象对另外一个对象B的状态变化感兴趣(1对多),因此对其进行观察.B维持着一个对本身感兴趣的对象列表,一旦本身发生变化,就通知这些对象。并不对等,一方只是“通知”,另外一方接到通知后执行特定行为。
中介模式:定义一个封装一组对象如何交互的对象。介体经过让对象明确地互相引用来促进松散耦合,而且可让您独立地改变它们的相互做用。
一组同类型的对象,彼此之间相互发/收消息(多对多),不存在谁观察谁的问题,全部对象都对等。每一个对象都维持一个中介,将通信的任务委托给它,本身只负责发送和接收便可,无需了解其余物体,实现了“解耦”。
观察者模式:本身来广播,其余对象接收;
中介模式:第三方中介负责广播(相似于“邮件列表”)。
命令
意图
将“指令”封装为对象,指令的全部细节对客户隐藏,在指令内对具体的ADT发出动做(调用ADT的细节操做)
问题
客户端但愿执行指令,但不想知道指令的细节,也不想知道指令的具体做用对象
命令将调用操做的对象与知道如何执行操做的对象分离。
每当客户端须要对象的“服务”时,Command对象的全部客户端都经过简单地调用对象的虚拟execute()方法将每一个对象视为“黑盒子”。
将全部对客户提供的指令与内部执行的ADT操做完全分开,指令对外看来是“黑盒” - 进一步“变本加厉”的封装!
一个Command类包含如下的一些子集:
外观与命令
外观:结构模式
命令:行为模式
均强调对某个复杂系统内部提供的功能的“封装”,对外提供简单的调用接口,简化客户端的使用,“隐藏”细节。
命令:强调将指令封装为了“对象”,提供了统一的对外接口(执行)。
外观:没有显式的“对象”,仍然经过类的方法加以调用。
责任链模式
问题
针对一个请求,可能有多个处理模块
各类不肯定状况存在,不能以“硬编码”的方式指明按何种次序调用处理模块
意图
避免在请求方和各处理者之间的紧耦合:构造流水线,请求在其上传,直到被处理为止。
将处理元素封装在“管道”抽象中; 并让客户在管道入口处“启动并离开”他们的请求。
客户端只需在流水线的入口发出请求便可,请求自动在流水线上传递,直到被处理。
该模式将接收对象连接在一块儿,而后将任何请求消息从对象传递到对象,直到它到达可以处理消息的对象。
处理器对象的数据和类型事先都不肯定,须要动态配置
使用递归组合的方式,将多个处理程序连成“职责链”
责任链简化了对象互连。
请求的发起者无需维护全部可能的处理程序对象,只需记录职责链的入口;每一个处理程序只须要维护“下一个”处理程序便可,从而简化了各个处理程序之间的链接关系。
访客与责任链
不是像传统类设计中将操做与数据捆绑在一块儿造成ADT,这两个设计模式都是将“数据”与“做用于数据上的客户端定制操做”分离开来
缘由:操做能够灵活增长,运行时使用的操做能够动态配置,多个操做的执行次序能够动态变化
区别1:visitor只定义了一个操做,chain of responsibility定义了一组操做及其之间的次序
区别2:访客中,客户建立访客以后传入ADT,ADT再将执行权委托到visitor;责任链中,控制权彻底在各个处理程序之间流转,ADT(请求对象)彻底感觉不到。
文本:“独立于制造商”,“独立于设备”,“必须支持一系列产品”
=>抽象工厂模式
文本:“必须与现有对象接口”
=>适配器模式
文本:“必须与多个系统接口,其中一些系统将在将来开发”,“必须展现早期的原型”
=>桥模式
文本:“必须与现有的一组对象接口”
=>外墙模式
文本:“复杂结构”,“必须具备可变的深度和宽度”
=>复合模式
文本:“必须是位置透明的”
=>代理模式
文本:“必须可扩展”,“必须可扩展”
=>观察者模式
文本:“必须提供独立于该机制的政策”
=>策略模式
组合,适配器,桥接,包装,代理(结构模式)
命令,观察者,策略,模板(行为模式)
抽象工厂,生成器(创造性模式)
创造性模式
结构模式
行为模式
对可重用性和可维护性设计模式的高层考虑