策略模式 模式功能说明:它使你能在运行时改变对象的行为。 模式思路与原理 策略模式中,我们创建对象,它们表示各种策略,并且一个上下文对象,它的行为根据其策略对象的行为而变化。策略对象改变上下文对象的执行算法。 案例 interface Strategy { public int doOperation(int num1, int num2); } class OperationAdd implements Strategy { @Override public int doOperation(int num1, int num2)...
责任链模式 模式功能说明:它让你可以将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或者将其传递给链上的下一个处理者。 模式思路与原理 职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。 案例 abstract class Handler { protected Handler successor; public void setSuccessor(Handler successor) { this...
代理模式 模式功能说明:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。 模式思路与原理 在代理模式中,一个类代表另一个类的功能。在代理中,我们创建具有现有对象的对象,以便向外界提供功能接口。 案例 interface Image { void display(); } class RealImage implements Image { private String filename; public RealImage(String filename) {...
享元模式 模式功能说明:通过共享的方式高效的支持大量细粒度的对象。 模式思路与原理 在有大量对象时,有可能会造成内存溢出,我们把其中共同的部分抽象出来,如果有相同的业务请求,直接返回在内存中已有的对象,避免重新创建。 主要角色: Flyweight(抽象享元类):通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。 ConcreteFlyweight(具体享元类):为内部状态提供成员变量进行存储。 UnsharedConcreteFlyweight(非共享具体享元类):通常是将Flyweight子类作为对象的成员...
装饰模式 模式功能说明:它可以让你动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。 模式思路与原理 装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰者之上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。 案例 // Component组件 -> P...
组合模式 模式功能说明:它可以让你将对象组合成树形结构,并且能像使用独立对象一样使用它们。 模式思路与原理 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 案例 // Component abstract class Graphic { public abstract void print(); } // Leaf class Circle extends Graphic { @Override public void pri...
桥接模式 模式功能说明:主要解决的是类的两个独立维度的扩展。 模式思路与原理 为了解决以下场景,使用合成/聚合复用原则,可通过桥接模式实现。 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。 案例 假设我们有一个形状类Shape和颜色类Color,形状有圆形和矩形,颜色有红色和蓝色。如果我们要创建红色的圆形和蓝色的矩形,那么就需要创建4个类,如果再增加形状或者颜色,类的数量就会呈指数级增长。这时候就可以...
适配器模式 模式功能说明:它使得原本由于接口不兼容而不能一起工作的类可以协同工作。 模式思路与原理 类的适配器模式:通过继承来实现适配器功能。当我们要将一个类A转化为接口B的实现类时,可以创建一个新的类,继承类A,实现接口B,然后在新的类中重写接口B的方法,调用类A的方法来实现。 对象的适配器模式:通过组合来实现适配器功能。当我们要将一个对象A转化为接口B的实现对象时,可以创建一个新的类,实现接口B,然后在新的类中创建一个类A的对象,再重写接口B的方法,调用类A的对象的方法来实现。 接口的适配器模式:当不希望实现一个接口中所有的方法时,可以创建一个抽象类,...
外观模式 模式功能说明:它为子系统中的一组接口提供了一个统一的高层接口,使得子系统更容易使用。 模式思路与原理 该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。 门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。(客户调用,同时自身调用子系统功能) 子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。(实现具体功能) 客户角色:通过调用Facede来完成要实现的功能(调用门面角色)。 ...
原型模式 模式功能说明:通过复制一个已经存在的实例来返回新的实例,而不是通过新建一个实例。 模式思路与原理 浅复制:将一个对象复制后,基本数据类型的变量都会重新创建,而引用类型,指向的还是原对象所指向的。 深复制:将一个对象复制后,不论是基本数据类型还有引用类型,都是重新创建的。简单来说,就是深复制进行了完全彻底的复制,而浅复制不彻底。clone明显是深复制,clone出来的对象是是不能去影响原型对象的 案例 假设我们要创建一个复杂的Pizza对象,它包括底饼、酱料、配料等部分。 public class Sheep implement...