您的位置:首页 > 其它

装饰者模式(decorator)完全解析

2016-11-07 15:31 351 查看
先看一下装饰者模式的UML图:



装饰模式到底是什么呢?举个简单的例子来说明,现在有一杯白开水(WaterClass),想向白开水里面加茶叶(TeaClass),加点糖(SugarClass),或者加点盐(SaltClass)。也许会认为那还不简单吗,加茶叶的白开水就再生成一个(WaterWithTeaClass),加糖的白开水就再生成一个(WaterWithSugarClass)这样不就行了吗?但是如果我们既要加糖又要加茶叶,或者加盐加糖这样的组合会很多,可能就要生成很多的类,造成类泛滥。这时候就要用到装饰者模式了。下面看看装饰者模式是如何轻松解决这个问题的。

还是先给出UML图便于理解:



DrinkDecorator:

public class  DrinkDecorator implements DrinkComponent{
DrinkComponent component;
public DrinkDecorator(DrinkComponent component) {
super();
this.component = component;
}

@Override
public void operation() {
// TODO Auto-generated method stub
}

}


WaterComponent:

public class WaterComponent implements DrinkComponent{

@Override
public void operation() {
// TODO Auto-generated method stub
System.out.print("water drink");
}

}


DrinkDecorator:

public class  DrinkDecorator implements DrinkComponent{
DrinkComponent component;
public DrinkDecorator(DrinkComponent component) {
super();
this.component = component;
}

@Override
public void operation() {
// TODO Auto-generated method stub
}

}


SugarDecorator:

public class SugarDecorator extends DrinkDecorator{

public SugarDecorator(DrinkComponent component) {
super(component);
// TODO Auto-generated constructor stub
}
public void operation()
{
component.operation();
System.out.print(",with sugar");
}
}


TeaDecorator:

public class TeaDecorator extends DrinkDecorator{

public TeaDecorator(DrinkComponent component) {
super(component);
// TODO Auto-generated constructor stub
}
public void operation()
{
component.operation();
System.out.print(",with Tea");
}
}


MainClass:

public class MainClass {

public static void main(String[] args) {
// TODO Auto-generated method stub
WaterComponent water=new WaterComponent();
SugarDecorator sugar=new SugarDecorator(water);
//往白开水里面加糖。
TeaDecorator tea=new TeaDecorator(sugar);
//往加糖的白开水里面加茶叶。
tea.operation();
/*一杯有茶叶和糖的白开水就这样产生了,你也可以自由的往白开水里面加自己喜欢的东西,而并不造成类泛滥只需要继承DrinkDecorator就行*/
}

}


有这个向白开水里面加配料的方法很容易让我们理解装饰者模式是怎样实现的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uml 装饰者模式