结构型设计模式之--装饰器模式

随着Peter水果生意越做越大,水果店根据客户的不同需求也添加了一些不同的服务,最原始的服务流程就是:水果采摘-->水果打包-->送货上门,就结束了。而现在由于不同客户有的需要加急处理,有的需要加固处理,有的需要认证这个水果的防伪标志,那么我们通过装饰器模式就可以很好地解决这些附加的需求业务。

装饰器模式可以在不影响业务主流程的前提下,在打包环节增加防伪、加固、加急等功能

不同的装饰加入到了打包流程中,增强了打包流程。

上面的蓝色部分还是原来的打包Bag,添加的紫色部分就是装饰器接口,以及不同的装饰具体实现类。

装饰器接口:

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

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

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

装饰器具体的三个实现类:

//实现类一:
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 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 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();
    }

    public 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();

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

    }
}

最终结果:包装完成后,又添加了三个包装的附加流程。

猜你喜欢

转载自blog.csdn.net/cpcpcp123/article/details/107298199