-
享元模式
享元模式是池技术的重要实现方式。定义 使用共享对象可有效地支持大量的细粒度的对象。这里有两个关键词:细粒度和共享的对象。为了避免细粒度导致的对象数量剧烈增加,享元模式对对象信息分为两部分:内部状态和外部状态。内部状态是对象可共享的信息,不随环境改变而改变。外部状态是对象得以依赖的一个标记,随环境改变而改变、不可共享。通用类图如下:类图中有这么几个角色:Flyweight抽象享元角色定义对象的外部状态和内部状态的接口或实现;ConcreteFlyweight具体享元角色实现具体业务,其中内...…
-
桥梁模式
桥梁模式经常被用来替代继承,重点在于解耦。定义 将抽象和实现解耦,使得两者可以独立变化。通用类图如下:类图中有这么几个角色:Abstraction抽象化角色定义角色行为并保存一个对实现化角色的引用;Implementor实现化角色定义角色必须的行为和属性;RefinedAbstraction修正抽象化角色引用实现化角色对抽象化角色进行修正。总的来说,抽象角色引用实现角色,部分功能由实现角色完成。优点 抽象和实现分离使用场景 不适合使用即成的场景 接口或抽象类不稳定的场景 重用性要...…
-
解释器模式
解释器模式维护比较繁杂,一般在项目中很少遇到。定义 给定一门语言,定义它的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子。通用类图如下:类图中AbstractExpression是TerminalExpression和NonterminalExpression的抽象。 TerminalExpression即终结符表达式,实现与文法中元素相关联的解释操作,一般只会有一个终结符表达式。NonterminalExpression即非终结符表达式,文法中每条规则对应一个...…
-
状态模式
状态模式和状态机关系密切,我们可以用状态机来辅助理解这个设计模式。定义 当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。通用类图如下:类图中有3种角色:State抽象状态角色负责定义对象状态和封装环境角色以实现状态切换;ConcreteState具体状态角色负责完成本状态行为管理和状态切换;Context环境角色定义客户端接口和执行具体状态切换。对于环境角色,一般有 把状态对象声明为静态常量 环境角色用委托方式具有状态抽象角色定义的所有行为优点 结构清晰,避免过...…
-
访问者模式
定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作通用类图如下:类图中有3种角色:Visitor访问者里定义它可以访问那些元素,具体就是visit方法的参数来确定;Element元素角色定义接受哪一类访问者访问,具体通过accept方法参数定义,方法体里通常是visitor.visit(this)写法;ObjectStruture元素产生者,一般容纳在多个不同类/接口的容器中。优点 符合单一职责 拓展性强 灵活性高缺点 具...…
-
备忘录模式
备忘录模式提供一份备份,当以后需要把对象恢复到某状态时会非常方便。定义 在不破坏封装性的前提下,捕获一个对象的内部状态,并在对象之外保存这个状态,这样以后就可将该对象状态恢复到原先保存的状态。通用类图如下:类图中包含3个角色:Originator发起人角色负责记录当前时刻状态,定义那些属于备份范围的状态,创建和恢复备忘录数据;Memento备忘录角色存储Originator发起人对象的内部状态;Caretaker备忘录管理员角色对备忘录进行保存和提供。使用场景 需要保存和恢复数据的相关...…
-
门面模式
门面模式在软件实现中比较少听到,但它封装的思想在很多实现中都能找到。定义 要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行,门面模式提供一个高层次的接口,使得子系统更易于使用通用类图如下:这个类图的意思是,Facade门面类把子系统的操作、通信都包了,提供一层封装。也即下图所示类图中包含2个角色:Facade门面角色知道子系统的功能,外界可以并且只能通过这个类操作子系统。这个类中没有业务逻辑,起委托作用。subsystem子系统可以有一个或多个子系统,包含实际业务逻辑。优点 ...…
-
迭代器模式
迭代器模式很常见又很不常用。因为很多语言都实现了迭代器模式,在开发过程中被作为常用工具,而不需要重新实现。定义 提供一种方法访问一个容器对象中各个元素,而又不暴露对象内部细节。通用类图如下:类图中有4个角色:Iterator抽象迭代器定义访问和遍历元素的接口,会有一些基本方法:next(),isDone()/hasNexrt(),remove()Aggregate抽象容器,负责提供创建具体迭代器的接口,Java中是iterator()方法剩余两个是它们的实现。使用场景 很多语言都自带了...…
-
组合模式
适配器模式是很常用的设计模式,解决不同系统、层次对接时经常会用到它。定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。通用类图如下:类图中包含2个角色:Component抽象构件定义组合对象共有的方法和属性,它是组合模式的精髓;Composite树枝对象是组合模式的重点,它的作用是组合树枝节点和叶子结点形成一个树形结构;Leaf叶子对象是遍历的最小单位,定义参加组合的原始对象行为优点 高层模块调用简单 叶子模块可以自由增加缺点 ...…
-
适配器模式
适配器模式是很常用的设计模式,它是包装模式的一种,也就是把源角色做一层包装,使其满足目标角色的要求。解决不同系统、层次对接时经常会用到它。定义 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配的而无法在一起工作的两个类能够在一起工作。适配器模式有两种:类适配器和对象适配器。它们之间最大的区别在于类适配器使用类间继承的方式,对象适配器使用对象的合成,或者说类的关联关系。相对来说,对象适配器在设计时会更加灵活。类适配器的通用类图如下:对象适配器的通用类图如下:在上述类图中...…
-
策略模式
策略模式可能名字很高大上,但其实它的思想我们在日常中使用得非常多,是一个简单而普遍的设计模式。定义 定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。通用类图如下:在类图中,Context即上下文角色,屏蔽高层模块对策略、算法的直接访问,封装可能存在的变化。Strategy通常是一个接口,定义策略/算法具有的方法或属性。策略模式其实就是使用了面向对象的继承和多态机制,在此基础上也没有增加多少设计,所以可能我们不经意间就用到了它。需要注意的是,策略模式和代理模式很像,不同的是策略...…
-
装饰模式
装饰模式可以理解成用组合的方式给对象增加功能。定义 动态地给一个对象增加添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。通用类图如下:在类图中有两种角色(不区分抽象和实现类)。其中Component是最核心、最原始的对象,类图中可以是接口或者抽象类。Decorator即装饰类,里面包含指向Component的指针,并且有相应的方法给Component增加功能。优点 装饰模式是继承的一个替代方案,还是is-a的关系,但是灵活性大大提高 可以动态扩展一个类的功能 装饰类...…
-
责任链模式
定义 使多个对象都有机会处理请求,从而避免发送者和接收者之间的耦合关系。核心做法是将这些对象连成一条链,使请求沿着链传递,直到有对象处理请求为止。通用类图如下:所谓责任链,通俗地讲就是把请求传给一个对象,它能处理则处理,不能处理则传给链条中下一个对象,整个过程颇似递归。优点最显著的优点是将请求和处理分开,请求者也不需要关心由谁处理、如何处理。缺点 性能问题,当链条比较长时尤其明显 调试不方便注意事项使用责任链条模式需要特别注意链条节点的数量,避免出现超长链。一般做法是设置节点数量阈值...…
-
命令模式
定义 将一个请求封装成对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能通用类图如下:在类图中有三个角色:Receiver执行命令,命令传递链条最终到达这里;Command即声明的命令;Invoker接收并执行命令。优点 类间解耦Invoker和Receiver区分开,Invoker使用时只需调用Command的execute方法无需关注到底谁哪个接收者 可拓展性高 结合其他模式可达到更强性能缺点当有N个命令时,Command子类会...…
-
中介者模式
当有多个对象相互依赖时,加入中介者,可以大大减少类间的耦合性。定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使耦合松散,而且可以独立地改变他们的行为类图如下;这个类图主要有两种角色:中介者及其同事。中介者负责协调同事的协作,必须依赖同事角色。每一个同事与其他同事通信时,必须通过中介者。同事角色的行为分为两类:本身完成的称为自发行为;需要依赖其他同事的称为依赖行为。对于两种角色,中介者一般只有一个,同事可以有多个,他们一般呈星形结构。优点减少了类间的依赖...…
-
原型模式
原型模式非常简单常见,通俗来说就是copy。定义 用原型实例创建指定对象的种类,并且通过拷贝这些原型创建新的对象。原型模式类图如下:看到这个类图是不是很亲切?那就对了!对于Java来说,由于Object类本身实现clone方法,也意味着一般Java对象都是可拷贝的(除非你复写cone方法)。优点 性能优良原型模式是直接拷贝内存二进制流,性能比new一个对象要好得多缺点 逃避构造函数的约束这其实既是优点也是缺点。优点是灵活,缺点是过于灵活。。。用这种方法可以躲过一般单例模式的限制(因为...…
-
模板模式
模板模式是一个相当简单的设计模式,很多使用java的人已经不自觉的用过了,因为它就是这个情景:在抽象类中定义和使用抽象方法,抽象方法在子类中具体实现,这种结构固定实现方法在子类中完成的方法就叫模板模式。定义定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义某些特定步骤。通用类图如下:AbstractClass叫模板抽象类,里面的方法分为两种:基本方法和模板方法,其中基本方法由子类负责实现,模板方法完成对基本方法对调度,为了安全,一般会用fina...…
-
Builder模式
Builder模式是Android领域常见的一个设计模式,随随便便一个开源库中你都能看到它的身影。Builder模式的普及和它的解耦、方便拓展、易于使用等特性有关。定义Builder模式是指将一个复杂对象的创建和表示相分离,使得同样的创建过程可以创建不同的表示。通用类图如下:Product类可有可无,一般是实现了模板方法,有ConcreteBuilder返回。Builder是抽象类,规范产品的定义,具体实现由ConcreteBuilder执行,Director是Builder的使用。Bui...…
-
观察者模式
观察者模式又叫发布订阅模式,有时候当一个对象状态发生改变时,我们希望能够自动通知相关的对象,这时候就用到观察者模式。应用场景在一个目录新建一个文件时,自动通知目录管理器增加目录;电视节目通过广播使电视机收到影像定义定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。UML图如下:这个模型很简单,分为被观察者、观察者、具体的被观察者和具体的观察者,最终通过回调的方式通知观察者更新状态。实现Subject类import java.util.Ve...…
-
代理模式
代理模式也叫委托模式,为其他对象提供一种代理以控制对这个对象的访问。状态模式、策略模式、访问者模式本质上是在更特殊的场合采用代理模式。应用场景防止直接访问目标对象带来的不必要复杂性面向切面编程(AOP)定义UML图如下:实现Subject类public interface Subject { void doSomething();}RealSubject类public class RealSubje...…