装饰者模式设计模式实现

装饰者模式实现步骤

  1. 已经有一个存在的实现方法,它是继承一个抽象类或者实现接口,如果不是需要继承一个抽象或者实现接口。
  2. 定义一个抽象的装饰类,继承第一步创建的抽象类或者实现接口。
  3. 定义具体装饰类来继承上面创建的抽象装饰类。
  4. 调用装饰类,里面需要传入被装饰的对象。

案例

我们以下单为例,先创建一个度假订单,然后后面业务扩展,发现在度假订单里面增加卖保险的功能。

创建的文件有 BaseCreateOrder.javaTourOrderCreate.javaDecorator.javaInsuranceDecorator.javaTestMain.java 文件。文件创建完毕,目录结构如下图:

08 装饰者模式代码结构图.png

BaseCreateOrder.java 代码如下:

package net.haicoder.decorator; /** * 基类创建订单 */ public abstract class BaseCreateOrder { public abstract void createOrder(); }

TourOrderCreate.java 具体的实现创建度假订单的逻辑。代码如下:

package net.haicoder.decorator; public class TourOrderCreate extends BaseCreateOrder { public void createOrder() { System.out.println("嗨客网(www.haicoder.ner)"); System.out.println("创建度假订单"); } }

Decorator.java 抽象装饰类,里面包含了抽象的创建订单的类。代码如下:

package net.haicoder.decorator; public abstract class Decorator extends BaseCreateOrder { private BaseCreateOrder createOrder; public Decorator(BaseCreateOrder createOrder) { this.createOrder = createOrder; } public void createOrder() { createOrder.createOrder(); } }

InsuranceDecorator.java 具体装饰类,继承了抽象的装饰类,里面有具体实现抽象逻辑的代码。代码如下:

package net.haicoder.decorator; /** * 具体装饰角色,负责给组件添加职责 * 把被传递的对象包装 */ public class InsuranceDecorator extends Decorator { public InsuranceDecorator(BaseCreateOrder createOrder) { super(createOrder); } public void createOrder() { super.createOrder(); System.out.println("创建订单的时候,添加了保险资源"); } }

TestMain.java 文件代码如下:

package net.haicoder.decorator; public class TestMain { public static void main(String[] args) { BaseCreateOrder createOrder = new TourOrderCreate(); InsuranceDecorator insuranceDecorator = new InsuranceDecorator(createOrder); insuranceDecorator.createOrder(); } }

程序运行后,控制台输出信息如下:

08 装饰者模式运行结果图.png

装饰模式总结

设计模式中装饰者模式替代了继承关系,简化了程序结构,为其装饰的对象增强功能,其对扩展开放,对修改关闭。