设计模式-装饰模式(应用场景)

什么是装饰者模式

应用场景

咖啡店里咖啡中可以加不同的配料–摩卡、牛奶、糖、奶泡;不同的饮品加上不同的配料有不同的价钱,怎样实现呢?

可能你的第一印象会想到使用继承, 
1. 首先定义一个咖啡基类 
2. 对于加糖的,加牛奶的,加摩卡的 ,加奶泡的,分别写一个子类继承 
3. 对于加糖,又加奶的写一个类,对于对于加糖,又摩卡的写一个类,对于对于加糖、又奶泡的写一个类,对于加糖,又加奶、摩卡的写一个类
说到这里,你会发现这里四种配料就要写十几种实现类了,那如果我们的配料是二十几种或者三十几种呢,那么使用继承这种 方式肯定会使我们的子类爆炸,那要怎样解决你,答案就是使用装饰者模式

定义

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

类UML图

怎样实现装饰者模式呢?

首先我们先来看一下我们的设计类图

  • 1) 首先我们定义一个Coffce基类
/**
 * @ explain:这里Coffee相当于我们的Component,
 * 是要装饰的类
 *
 * @ author:xujun on 2016/7/10 23:16
 * @ email:[email protected]
 */
public abstract class Coffee {

    /**
     *
     * @return 返回价格
     */
    public abstract int getPrice();

    /**
     * 返回名字
     * @return
     */
    public abstract String getName();
}
  • 2) 接着 我们定义一个Decorator类继承 我们的Coffice基类
/**
 * @ explain:
 * @ author:xujun on 2016/7/10 23:21
 * @ email:[email protected]
 */
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";
    }
}

其实核心代码就下面一行,在原来的价格加上 加牛奶的价格

 

其实核心代码就下面一行,在原来的价格加上 加牛奶的价格

return mCoffee.getPrice()+10
  • 4)接下来不难想象加糖,就奶泡。就摩卡的操作,都是在原来的之上加上配料的价格
return mCoffee.getPrice()+2;
return mCoffee.getPrice()+15;
return mCoffee.getPrice()+20;

总结

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

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

mCoffee = new SimpleCoffee();
mCoffee = new SugarDecorator(mCoffee);
mCoffee = new MilkDecorator(mCoffee);

int price1 = mCoffee.getPrice();
System.out.println("price1="+price1);

装饰者模式的优缺点

优点

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

你可能感兴趣的:(设计模式)