美文网首页
(十)装饰器模式

(十)装饰器模式

作者: feiry | 来源:发表于2019-08-06 22:29 被阅读0次
    打包水果

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

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

    装饰器模式

    装饰器架构

    有一个顶层接口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多态的经典体现

    相关文章

      网友评论

          本文标题:(十)装饰器模式

          本文链接:https://www.haomeiwen.com/subject/rxugdctx.html