您的位置:首页 > 其它

设计模式-装饰者模式

2018-02-21 12:46 429 查看
装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

用图片来表示大概是这样:


<
4000
br>
(图片取自:https://segmentfault.com/a/1190000008305233

举个粟子:

假设我们是一间奶茶店的老板,有牛奶,绿茶,果汁三种饮品,三种饮品才可以自由添加白糖、椰果、珍珠。

例如:双倍白糖梛果牛奶

我们可以利用装饰者模式者模式来完成这种需求。

首先,我们给所有的奶茶设计一个父类(被装饰者),所有饮品都继承于它

public abstract class Drink {
String description = "Drink";
//饮料的说明
public String getDescription() {
return description;
}
//饮料的价格
public abstract double cost();
}

//接着,我们设计一个装饰者类,它继承于Drink类,且它为所有添加料的父类
public abstract class Decorator extends Drink{
public abstract String getDescription();
}


有了上面两个类之后,我们可以设计饮品类和加料类了

//牛奶类
public class Milk  extends Drink {
public Milk() {
description = "Milk" + "  Add:";
}

public double cost() {
return 5.0;
}
}

//果汁类
public class Juice extends Drink {
public Juice() {
description = "Juice" + "  Add:";
}
public double cost() {
return 3.0;
}
}

//绿茶类
public class GreenTea extends Drink {
public GreenTea() {
description = "Green Tea" + "  Add:";
}

public double cost() {
return 4.0;
}
}


接下来就是加料类

//白糖类
public class Sugar extends Decorator {
Drink drink; //用一个实例变量记录被装饰者(在本例中是饮品)

//构造方法
public Sugar(Drink drink) {
this.drink = drink;
}

public String getDescription() {
return drink.getDescription() + " Sugar";
}

//用被装饰者的价格再加上自己的价格
public double cost() {
return drink.cost() + 0.2;
}
}

//珍珠类
public class Bubble extends Decorator {
Drink drink;
public Bubble(Drink drink) {
this.drink = drink;
}
@Override
public String getDescription() {
return drink.getDescription() + " Bubble";
}

@Override
public double cost() {
return drink.cost() + 0.5;
}
}

//梛果类
public class Coconut extends Decorator {
Drink drink;
public Coconut(Drink drink) {
this.drink = drink;
}

@Override
public String getDescription() {
return drink.getDescription() + " Coconut";
}

@Override
public double cost() {
return drink.cost() + 1.0;
}
}


最后,我们就可以进行测试啦! 我们来弄一杯双倍白糖梛果牛奶试试。

public class DrinkShop {
public static void main(String[] args) {
Drink drink = new Milk();
drink = new Sugar(drink);
drink = new Sugar(drink);
drink = new Coconut(drink);
System.out.println(drink.getDescription() + ", Sum: " + drink.cost() );
}
}


运行结果如下:



成功运行。

使用这种模式的优点:

1. 装饰者模式与继承关系的目的都是要扩展对象的功能,但是装饰者模式可以提供比继承更多的灵活性。

2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: