随着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();
//以下物流运输业务。。。。
}
}
最终结果:包装完成后,又添加了三个包装的附加流程。