装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能。
一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能。
我们还是来玩一句红警,首先我们进入游戏,这时我们只有一个基地车,右边的界面有个黑色的框,什么操作也没有。
这里,我们假定有个操作的接口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.可以分开核心功能和装饰的新功能,在不同场景用不同的装饰,而且可以有选择有顺序的包装。
时间: 2024-11-03 22:34:31