zoukankan      html  css  js  c++  java
  • 设计模式-装饰模式学习笔记

    装饰模式(结构型模式)

    装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。[DP]

    自己的理解在不对原有类进行修改的情况下动态的对它进行扩展一些功能 


    • 优缺点

    优点:

    1. 满足开闭原则
    2. 能够动态的增删功能,比继承更灵活

    缺点:

    1. 会多出很多小类,增加了程序的复杂性
    2. 难以排错(多级装饰的对象,排错需要逐级排查)

    • 特点
    1. 装饰对象和被装饰对象有共同的父类
    2. 装饰对象持有一个被装饰对象的实例(体现为拥有一个属性是父接口的对象)
    3. 装饰对象对调用方传过来的请求会转发给被装饰对象(体现为所有的子装饰类在操作时都会调用装饰类的方法,而装饰类会通过调用父接口对象的方法去调用被装饰对象的方法)
    4. 子装饰类在调用装饰对象的方法时会新增其他一些附加功能(装饰模式的意义)

    • 结构

    Component:装饰对象和被装饰对象的共同父类

    ConcreteComponent:被装饰类,也为具体实现类

    Decorator:装饰类,自装饰类的父类

    ConcreteDecoratorA:子装饰类,提供特定的装饰

    ConcreteDecoratorB:子装饰类,提供特定的装饰

    更多的ConcreteDecorator(C,D,E,F)


    • 代码

    例子:武装机甲,一台机甲,没有任何装备,现在需要给机甲装上各种装备,机甲是被装饰对象,给机甲新增装备为装饰类,动态的添加武器装备和防具装备

           被装饰对象与装饰对象的共同父类

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 3:02
     * @ Description:装饰对象和被装饰对象的共同父类
     */
    public interface Component {
         void operation();
    }
    

      被装饰对象,拥有完整的操作

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 3:06
     * @ Description:被装饰者对象   机甲类
     */
    public class ConcreteComponent implements Component{
        @Override
        public void operation() {
            System.out.println("末日机甲前来报道,装备:");
        }
    }
    

      装饰类,持有一个被装饰对象的引用,并且在被调用时,调用被装饰对象的方法

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 3:09
     * @ Description:装饰类  
     */
    public abstract class Decorator implements Component {
    
        //持有一个被装饰对象的引用
        private Component component;
    
        public void setComponent(Component component) {
            this.component = component;
        }
    
        @Override
        public void operation() {
            if(component != null){
                component.operation();
            }
        }
    }
    

      子装饰类,在调用提供特定的装饰操作时,调用父类方法

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 3:18
     * @ Description:具体装饰类  机甲装备武器改装类
     */
    public class ConcreteDecoratorA extends Decorator{
        @Override
        public void operation() {
            super.operation();
            System.out.println("改装:等离子高频激光剑");
        }
    } 
    

      同上

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 3:28
     * @ Description:具体装饰类  机甲装备防具改装类
     */
    public class ConcreteDecoratorB extends Decorator{
        @Override
        public void operation() {
            super.operation();
            System.out.println("改装:全适应立场防护盾");
        }
    }

            客户端调用类

    /**
     * @ Author     :fonxi
     * @ Date       :2019/5/13 3:00
     * @ Description:客户端调用类
     */
    public class TestController {
        public void print(){
            ConcreteComponent concreteComponent = new ConcreteComponent();
            ConcreteDecoratorA cA = new ConcreteDecoratorA();
            ConcreteDecoratorB cB = new ConcreteDecoratorB();
            cA.setComponent(concreteComponent);
            cB.setComponent(cA);
            cB.operation();
        }
    }
    

      

    输出结果:

    末日机甲前来报到,装备:
    改装:等离子高频激光剑
    改装:全适应立场防护盾  
    

      


    • 总结

    装饰模式能动态的扩展一个类,并且不修改原来的类,能够灵活的增删,比继承要好。(感觉作用和代理模式有点象^_^)

  • 相关阅读:
    删除文件夹右键下的部分目录
    c# datagridview导出到excel【转载】
    使用AO新增记录的3种方法【转载】
    AE 打包
    ArcMap 9使用技巧
    ArcEngine 渲染的使用【转载】
    关于数据库版本压缩
    SDE数据源直连
    ArcCatalog 9中的使用技巧
    AE指定字段转成注记
  • 原文地址:https://www.cnblogs.com/fonxi/p/10860043.html
Copyright © 2011-2022 走看看