设计模式(三)装饰者模式Decorator

  装饰者模式针对的问题是:对一个结构已经确定的类,在不改变该类的结构的情况下,动态增加一些功能。

  一般来说,都是对一些已经写好的架构增加自己的功能,或者应对多种情况,增加功能。

  我们还是来玩一句红警,首先我们进入游戏,这时我们只有一个基地车,右边的界面有个黑色的框,什么操作也没有。

  这里,我们假定有个操作的接口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();
}
}

  设计模式(三)装饰者模式Decorator

  甚至说,我们的操作还可以合二为一,一起做(装饰者也是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();
}
}

  设计模式(三)装饰者模式Decorator

  思考与总结:

  1.Decorator装饰者模式,添加功能用,一般在加入的新功能在特定的环境下用时,不便修改原来的代码。

  2.可以分开核心功能和装饰的新功能,在不同场景用不同的装饰,而且可以有选择有顺序的包装。

  

  

上一篇:最新的C#SqlHelper 类苏飞修改版(转载)


下一篇:== 和 equals,equals 与 hashcode,HashSet 和 HashMap,HashMap 和 Hashtable