首页 > 代码库 > 设计模式(三)装饰者模式Decorator

设计模式(三)装饰者模式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();
    }
}

  技术分享

  甚至说,我们的操作还可以合二为一,一起做(装饰者也是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.可以分开核心功能和装饰的新功能,在不同场景用不同的装饰,而且可以有选择有顺序的包装。

  

 

  

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