(十)装饰器模式

2019-08-06  本文已影响0人  feiry
打包水果

主要业务流程:
水果采摘 ----- 水果打包 ------ 送货上门

现在我们希望在水果打包这个环节做一些增强功能,同时又不影响主要业务流程,应该如何做?

装饰器模式

装饰器架构

有一个顶层接口Bag
AppleBag和OrangeBag都是普通包装的实现类
这时候我们需要一个附加操作的实现类BagDecorator

public interface Bag {

    void pack();

}
public class BagDecorator implements Bag {
    private Bag bag;  //维持一个对抽象构件对象的引用

    public BagDecorator(Bag bag)  //注入一个抽象构件类型的对象
    {
        this.bag = bag;
    }

    public void pack() {
        bag.pack();
    }
}

这个附加操作时一个打包操作所以实现Bag功能,内部有一个Bag抽象引用,是用来包装的对象,而pack方法则使用bag抽象引用的pack方法

public class CheckedBagDecorator extends BagDecorator {
    public CheckedBagDecorator(Bag bag) {
        super(bag);
    }

    public void pack() {
        super.pack();  //调用原有业务方法
        checked();  //打印防伪标识
    }

    //增加防伪标识
    public void checked() {
        System.out.println("------");
        System.out.println("打印上防伪标识");
    }
}
public class ReinforceBagDecorator extends BagDecorator {
    public ReinforceBagDecorator(Bag bag) {
        super(bag);
    }

    public void pack() {
        super.pack();  //调用原有业务方法
        reinforce();
    }

    //加固包装
    public void reinforce() {
        System.out.println("------");
        System.out.println("加固了包装");
    }
}
public class SpeedDecorator extends BagDecorator {
    public SpeedDecorator(Bag bag) {
        super(bag);
    }

    public void pack() {
        super.pack();  //调用原有业务方法
        speedy();
    }

    //快件加急
    public void speedy() {
        System.out.println("------");
        System.out.println("打上加急标识");
    }
}

public class DecoratorClient {
    public static void main(String[] args){
        sendFruit();
    }

    private static void sendFruit(){
        AbstractFactory factory = new AppleFactory();

        //得到水果
        Fruit fruit = factory.getFruit();
        fruit.draw();
        //得到包装
        Bag bag = factory.getBag();

        //现需要增加防伪标识
        bag = new CheckedBagDecorator(bag);//防伪功能
        bag = new ReinforceBagDecorator(bag);//加固功能
        bag = new SpeedDecorator(bag);//加急功能

        bag.pack();

        //以下物流运输业务。。。。
    }
}

getBag()是得到普通的苹果包装,这时候我们想要做增强操作,那么使用实现了BagDecorator的子类即可,使用装饰器模式的好处是,可以不停地增强,而没有影响到主业务流程

适用场景

封装原有功能,并且可以灵活的多次增强

总结

装饰器模式是一种增强模式,并且可以不影响主要流程,Java多态的经典体现

上一篇下一篇

猜你喜欢

热点阅读