主要业务流程:
水果采摘 ----- 水果打包 ------ 送货上门
现在我们希望在水果打包这个环节做一些增强功能,同时又不影响主要业务流程,应该如何做?
装饰器模式
装饰器架构有一个顶层接口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多态的经典体现
网友评论