Java设计模式之——装饰者设计模式
装饰者设计模式:我们都知道在如果一个类被很多次的继承,会出现雷爆炸的现象,这样处理起来可能就会有点麻烦。所以为了解决这个问题,我们初识到了装饰者设计模式。装饰者设计模式会动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活,该模式以对客户透明的方式扩展对象的功能。想要扩展功能,装饰者提供有别于继承的另一种选择。
我们在买豆浆时,有很多中选择,例如纯豆浆、纯豆浆+糖、纯豆浆+糖+黑豆等等。但是我们怎么来实现的哪。
装饰者设计模式思想:
- 定义一个接口,被装饰者对象基类,接口中含括了这个豆浆的基本信息。Drink();
- 定义一个具体的被装饰者对象,纯豆浆类。SoyaBeanMilk();
- 定义一个装饰者抽象类,维护指向Drink实例的引用。Decorator();
- 定义一个具体的装饰者对象,给内部持有的具体被装饰者对象增加具体的职责。SugarDecorator();
- 定义一个测试类。Test();
首先,我们先定义了一个接口,来描述豆浆的种类以及费用;
Drink();
package com.xiaofeng.decorator;
public interface Drink {
public String desicripte();
public float cost();
}
接下来:我们定义了一个纯豆浆的类。
SoyaBeanMilk();
package com.xiaofeng.decorator;
public class SoyaBeanMilk implements Drink{
@Override
public String desicripte() {
return "纯豆浆";
}
@Override
public float cost() {
// TODO Auto-generated method stub
return 2f;
}
}
再往后,我们会想到,有了纯豆浆之后,我们怎么往里面添加新的东西,也就是怎么再装饰这个纯豆浆,让它变得好喝一点。首先,我们先定义一个装饰者的基类。
Decorator ();
package com.xiaofeng.decorator;
public class Decorator implements Drink{
// 要装饰的对象
private Drink drink;
public Decorator(Drink drink){
this.drink = drink;
}
@Override
public String desicripte(){
return drink.desicripte();
}
@Override
public float cost() {
return drink.cost();
}
}
再往下,我们就可以增加我们想要的东西了,例如:加糖
SugarDecorator ();
package com.xiaofeng.decorator;
public class SugarDecorator extends Decorator {
public SugarDecorator(Drink drink){
super(drink);
}
@Override
public String desicripte() {
return super.desicripte() + "糖";
}
@Override
public float cost() {
return super.cost() + 2f;
}
}
其他的功能类似,读者可以自行增加。
为了测试我们的豆浆买的成功不成功,我们定义一个Test测试类:
Test ();
package com.xiaofeng.decorator;
public class Test {
public static void main(String[] args) {
Drink drink = new SoyaBeanMilk();
// 往豆浆中添加糖
SugarDecorator sDrink = new SugarDecorator(drink);
System.out.println(bsDrink.desicripte());
System.out.println(bsDrink.cost());
}
}
测试结果:
到这里,我们就完成了买豆浆的过程。
这是我自己对装饰者设计模式的理解,如果有什么更好的地方,期待和大家的交流。