• 装饰者模式后续理解消化中


    /**
     * 
     */
    package decorator2;
    
    /**
     * @author wangjian2
     *
     */
    public interface InterfaceComponent {
        public void say();
    }
    package decorator2;
    
    public class Component implements InterfaceComponent {
    
        @Override
        public void say() {
            System.out.println("Component.say():原组件的方法!");
        }
    
    }
    package decorator2;
    
    public abstract class AbstractDecorator implements InterfaceComponent {
    
        private InterfaceComponent component;
    
        public AbstractDecorator(InterfaceComponent component) {
            this.component = component;
        }
    
        /**
         * 组件方法执行前预处理方法
         * 
         */
        protected void preSay() {
        };
    
        /**
         * 组件方法执行后处理方法
         * 
         */
        protected void afterSay() {
        };
    
        public void say() {
    
            preSay();
            component.say();
            afterSay();
    
        };
    }
    package decorator2;
    
    public class DecoratorTwo extends AbstractDecorator {
    
        public DecoratorTwo(InterfaceComponent component) {
            super(component);
            // TODO 自动生成构造函数存根
        }
    
        /**
         * 根据需要重载模板类preSay()方法
         */
        protected void preSay() {
            System.out.println("DecoratorTwo.preSay():装饰者二的preSay()方法!");
        }
    
        /**
         * 根据需要重载模板类afterSay()方法
         */
        protected void afterSay() {
            System.out.println("DecoratorTwo.afterSay():装饰者二的afterSay()方法!");
        }
    
    }
    package decorator2;
    
    public class DecoratorOne extends AbstractDecorator {
    
        public DecoratorOne(InterfaceComponent component) {
            super(component);
            // TODO 自动生成构造函数存根
        }
    
        /**
         * 根据需要重载模板类preSay()方法
         */
        protected void preSay() {
            System.out.println("DecoratorOne.preSay():装饰者一的preSay()方法!");
        }
    
        /**
         * 根据需要重载模板类afterSay()方法
         */
        protected void afterSay() {
            System.out.println("DecoratorOne.afterSay():装饰者一的afterSay()方法!");
        }
    
        /**
         * 测试方法
         * 
         * @param args
         */
        public static void main(String[] args) {
            // TODO 自动生成方法存根
            InterfaceComponent interfaceComponent = new DecoratorTwo(
                    new DecoratorOne(new Component()));
            interfaceComponent.say();
            /*
             * 控制台输出: DecoratorTwo.preSay():装饰者二的preSay()方法!
             * DecoratorOne.preSay():装饰者一的preSay()方法! Component.say():原组件的方法!
             * DecoratorOne.afterSay():装饰者一的afterSay()方法!
             * DecoratorTwo.afterSay():装饰者二的afterSay()方法!
             */
        }
    }

    执行顺序:

    interfaceComponent.say()=》DecoratorTwo继承AbstractDecorator的say()方法,并执行该方法=》执行DecoratorTwo的preSay方法=》
    DecoratorTwo的构造方法的参数component是DecoratorOne,所以执行DecoratorOne的say方法=》

    执行DecoratorOne的preSay方法=》执行Component类的say()方法=》执行DecoratorOne的afterSay方法=》
    执行DecoratorTwo的afterSay方法
    输出结果:

    DecoratorTwo.preSay():装饰者二的preSay()方法!
    DecoratorOne.preSay():装饰者一的preSay()方法!
    Component.say():原组件的方法!
    DecoratorOne.afterSay():装饰者一的afterSay()方法!
    DecoratorTwo.afterSay():装饰者二的afterSay()方法!



    二、另一种装饰者模式代码
    /**
     * 
     */
    package decorator3;
    
    /**
     * @author wangjian2
     *
     */
    public interface Component {
        
        public double price();
    }
    
    
    /**
     * 
     */
    package decorator3;
    
    /**
     * @author wangjian2
     *
     */
    public class AllNeedMilk implements Component {
        private double price = 10.5;
    
        @Override
        public double price() {
            // TODO Auto-generated method stub
            return this.price;
        }
    
    }
    /**
     * 
     */
    package decorator3;
    
    /**
     * @author wangjian2
     *
     */
    public abstract class Fruit implements Component {
        private Component component;
        
        public Fruit(Component component) {
            this.component = component;
        }
        
        protected double newPrice() {
            return 0;
        }
        
        public double price(){
            return newPrice()+component.price();
        }
    }
    /**
     * 
     */
    package decorator3;
    
    /**
     * @author wangjian2
     *
     */
    public class Apple extends Fruit {
    
        public Apple(Component component) {
            super(component);
            // TODO Auto-generated constructor stub
        }
        
        protected double newPrice() {
            return 20;
        }
    
    }
    /**
     * 
     */
    package decorator3;
    
    /**
     * @author wangjian2
     *
     */
    public class Orange extends Fruit {
    
        public Orange(Component component) {
            super(component);
            // TODO Auto-generated constructor stub
        }
        
        protected double newPrice() {
            return 30;
        }
    
    }
    /**
     * 
     */
    package decorator3;
    
    /**
     * @author wangjian2
     *
     */
    public class Test {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            Component apple = new Apple(new Orange(new AllNeedMilk()));
            System.out.println(apple.price());
            Component orange = new Orange(new AllNeedMilk());
            System.out.println(orange.price());
        }
    
    }

    输出结果:

    60.5
    40.5

     
  • 相关阅读:
    Python中的垃圾回收机制
    一个很好的复习网站
    数据结构与算法 python语言描述
    数据结构与算法学习链接
    [转] 什么是WSGI
    【转】HTTP协议详解
    【转】Android HTTP协议
    Android获取本机IP地址
    Andrid 多线程下载
    Android 应用程序启动过程源代码分析
  • 原文地址:https://www.cnblogs.com/usual2013blog/p/3123606.html
Copyright © 2020-2023  润新知