zoukankan      html  css  js  c++  java
  • 装饰模式

    一、装饰模式

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

    将不同的装饰功能,即需要向原有类添加的功能集成于不同的类当中,让这个类包装所要修饰的对象。

    那么当需要有顺序地执行特殊的行为时,就可以采用装饰模式了。

    二、实现思路

    abstract class Component{
        public abstract void operation();
    }
    
    //原有类
    class ConcreteComponent extends Component{
        @Override
        public void operation() {
            System.out.println("具体对象的操作");
        }
    }
    
    //装饰类
    class Decorator extends Component{
        protected Component component;
    
        //将需要装饰的类设置进Decorator
        public void setComponent(Component component){
            this.component=component;
        }
    
        //执行原有操作
        @Override
        public void operation() {
            if (component!=null){
                component.operation();
            }
        }
    }
    
    class ConcreteDecoratorA extends Decorator{
        private String addedState;
    
        @Override
        public void operation() {
            super.operation();
            addedState="new state";
            System.out.println("具体装饰对象A的操作");
        }
    }
    
    /**
     * 首先运行原Component的operation(),
     *  再执行本类的功能,如addedBehavior(),
     *  相当于对原Component进行了装饰
     */
    class ConcreteDecoratorB extends Decorator{
        
        @Override
        public void operation() {
            super.operation();
            addedBehavior();
            System.out.println("具体装饰对象B的操作结束");
        }
    
        private void addedBehavior(){
            System.out.println("装饰对象B添加行为");
        }
    }
    
    //客户端代码
    class DecorationMain{
        public static void main(String[] args) {
            ConcreteComponent c=new ConcreteComponent();
            ConcreteDecoratorA d1=new ConcreteDecoratorA();
            ConcreteDecoratorB d2=new ConcreteDecoratorB();
            /**
             * 其实就是:
             *  首先用ConcreteComponent实例化对象c,
             *  然后用ConcreteDecoratorA的实例化对象d1来包装c,
             * 再用ConcreteDecoratorB的对象d2来包装d1,
             *  最后执行d2的operation()方法
             */
            d1.setComponent(c);
            d2.setComponent(d1);
            d2.operation();
        }
    }




    菜甜二的学习笔记and总结啊。。。总会遇到挫折,可是还是要保持开阔的心态才能开心的学习啊,坚持吧。
  • 相关阅读:
    【JDK】:java.lang.Integer源码解析
    使用truelicense实现用于JAVA工程license机制(包括license生成和验证)
    Android Button.getWidth()为0的问题
    nacos启动报错nacos Unable to start web server;
    Oracle字符集相关学习笔记记录
    Oracle触发器简单使用记录
    Oracle分析函数、窗口函数简单记录汇总
    Oracle远程数据建物化视图(materialized)创建简单记录,以及DBLINK的创建
    Oracle 行列转换函数pivot、unpivot的使用(二)
    Oracle递归查询(start with…connect by prior)
  • 原文地址:https://www.cnblogs.com/chen-ying/p/11072969.html
Copyright © 2011-2022 走看看