装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能。
一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能。
我们还是来玩一句红警,首先我们进入游戏,这时我们只有一个基地车,右边的界面有个黑色的框,什么操作也没有。
这里,我们假定有个操作的接口Operation
public interface Operation {
//操作
public void doOperation();
}
我们自己,叫做一个MyOperation,实现我们的操作接口,说明我们是可以有操作的,但现在很迷茫,不知道干啥。
public class MyOperation implements Operation{ @Override
public void doOperation() {
// TODO Auto-generated method stub
System.out.println("该干点啥");
}
}
玩过红警的都知道,当然,没玩过的我现在告诉你,红警第一步,让基地车打坐,这样我们才会多出一些功能,才有更多的操作去做。
但是,我们的MyOperation是已经写好了的,不能游戏每次有进展,都重新去改一遍代码,但是为了增加功能,于是程序员就想到了一个叫做装饰者的模式来实现这个功能。
先搭建一个装饰者的抽象类,其他装饰者继承这个抽象类就可以了。
装饰者 持有一个被装饰的对象,都是操作,所以他们都实现Operation接口,并且增加了一个消耗金币的函数
public abstract class DecoratorOperation implements Operation{
public Operation operation; public DecoratorOperation(Operation operation){
this.operation=operation;
} @Override
public void doOperation() {
// TODO Auto-generated method stub
operation.doOperation();
}
protected void consume(){ }
}
随着游戏进程,我么多了一个兵营,有一个造美国大兵的操作了。所以聪明的程序员想到了加入一个装饰者,增加这个功能。
public class SoldierOperation extends DecoratorOperation{ public SoldierOperation(Operation operation){
super(operation);
}
@Override
public void doOperation() {
// TODO Auto-generated method stub
operation.doOperation();
makePanzer();
}
public void makePanzer(){
System.out.println("开始制造美国大兵");
}
@Override
protected void consume() {
// TODO Auto-generated method stub
System.out.println("花费了50金");
}
}
美国大兵站站底盘挖挖矿,又多了个战车的功能
public class PanzerOperation extends DecoratorOperation{ public PanzerOperation(Operation operation){
super(operation);
}
@Override
public void doOperation() {
// TODO Auto-generated method stub
operation.doOperation();
makePanzer();
}
public void makePanzer(){
System.out.println("开始制造坦克");
}
@Override
protected void consume() {
// TODO Auto-generated method stub
System.out.println("花费了100金");
}
}
现在可以试试了,本来迷茫度日的基地有事干了
public class RedAlert {
public static void main(String[] args) {
MyOperation me=new MyOperation();
me.doOperation();
PanzerOperation panzer=new PanzerOperation(me);
panzer.doOperation();
SoldierOperation soldier=new SoldierOperation(me);
soldier.doOperation();
}
}
甚至说,我们的操作还可以合二为一,一起做(装饰者也是Operation 的实现类)
public class RedAlert {
public static void main(String[] args) {
MyOperation me=new MyOperation();
me.doOperation();
PanzerOperation panzer=new PanzerOperation(me);
panzer.doOperation();
SoldierOperation soldier=new SoldierOperation(panzer);
soldier.doOperation();
}
}
思考与总结:
1.Decorator装饰者模式,添加功能用,一般在加入的新功能在特定的环境下用时,不便修改原来的代码。
2.可以分开核心功能和装饰的新功能,在不同场景用不同的装饰,而且可以有选择有顺序的包装。