zoukankan      html  css  js  c++  java
  • 设计模式(三)装饰者模式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.可以分开核心功能和装饰的新功能,在不同场景用不同的装饰,而且可以有选择有顺序的包装。

      

      

  • 相关阅读:
    第08组 Beta冲刺 (3/5)
    第08组 Beta冲刺 (2/5)
    第08组 Beta冲刺 (1/5)
    软工实践个人总结
    实验 7:OpenDaylight 实验——Python 中的 REST API 调用
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    2020软工第二次结对作业
    实验 5 : OpenFlow 协议分析和 OpenDaylight 安装
    2020软工第一次结对作业
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
  • 原文地址:https://www.cnblogs.com/alexfly/p/7308965.html
Copyright © 2011-2022 走看看