美文网首页
设计模式系列-装饰者模式

设计模式系列-装饰者模式

作者: Yang0503 | 来源:发表于2019-03-15 17:30 被阅读0次

    我觉得装饰者模式是在已有功能的基础之上,动态地添加更多 功能的一种方式,这些新加的代码装饰了原有类的 核心职责或主要行为。

    类UML图

    image.png

    1、首先我们定义一个Coffce基类

    /**
     * @ explain:这里Coffee相当于我们的Component,
     * 是要装饰的类
     *
     */
    public abstract class Coffee {
    
        /**
         *
         * @return 返回价格
         */
        public abstract int getPrice();
    
        /**
         * 返回名字
         * @return
         */
        public abstract String getName();
    }
    

    2、接着 我们定义一个Decorator类继承 我们的Coffice基类

    /**
     * @ explain:Decorator类继承 我们的Coffice基类
     * @ author:
     * @ email:
     */
    public abstract class Decorator extends Coffee{
    
        protected Coffee mCoffee;
    
        /**
         * 通过组合的方式把Coffee对象传递进来
         * @param coffee
         */
        public Decorator(Coffee coffee){
            mCoffee=coffee;
        }
    }
    

    3、接下来我们来看我们的子类是怎样实现的

    public class MilkDecorator extends Decorator {
    
        /**
         * 通过组合的方式把Coffee对象传递进来
         *
         * @param coffee
         */
        public MilkDecorator(Coffee coffee) {
            super(coffee);
        }
    
        @Override
        public int getPrice() {
            return mCoffee.getPrice()+10;
        }
    
        @Override
        public String getName() {
            return "addMilk";
        }
    }
    

    4、接下来不难想象加糖,就奶泡。就摩卡的操作,都是在原来的之上加上配料的价格

    return mCoffee.getPrice()+2;
    return mCoffee.getPrice()+15;
    return mCoffee.getPrice()+20;
    

    以后你想要计算加糖,就牛奶,加奶泡的咖啡的价格,只需要这样

    mCoffee = new SimpleCoffee();
    mCoffee = new SugarDecorator(mCoffee);
    mCoffee = new MilkDecorator(mCoffee);
    mCoffee = new MilkFoamDecorator(mCoffee);
    int price1 = mCoffee.getPrice();
    System.out.println("price1="+price1);
    

    以后你想要计算加糖,就牛奶咖啡的价格,只需要这样

    mCoffee = new SimpleCoffee();
    mCoffee = new SugarDecorator(mCoffee);
    mCoffee = new MilkDecorator(mCoffee);
    int price1 = mCoffee.getPrice();
    System.out.println("price1="+price1);
    

    装饰者模式的优缺点

    优点

    • 把类中的装饰功能从类中搬除,可以简化原来的类
    • 可以把类的 核心职责和装饰功能区分开来,结构清晰 明了并且可以去除相关类的重复的装饰逻辑。

    相关文章

      网友评论

          本文标题:设计模式系列-装饰者模式

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