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

      装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构,这种模式的实现有两种

      实现1、通过继承原有的类,在保证父类原有功能的基础上,提供额外的功能

      实现2、创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。

      场景:将旧手机换新

      实现1:定义旧手机以旧翻新接口

    /**
     * 旧手机抽象
     * @author test11
     */
    public abstract class OldPhone {
    
        /**
         * 主要装饰的目的:以旧变新
         */
        public abstract void changeNew();
    
    }

       将旧手机更换下外壳,装饰成新手机

    /**
     * 装饰手机
     * @author test11
     */
    public class NewPhone1 extends OldPhone{
    
        public void swapHull(){
            System.out.println("换外壳");
        }
    
        @Override
        public void changeNew() {
            this.swapHull();
        }
    }

      继承之前更新的基础,换零件+换包装,装饰成新手机

    /**
     * 翻新手机
     * @author test11
     */
    public class NewPhone2 extends NewPhone1 {
    
        public void swapMachine(){
            System.out.println("换零件");
        }
    
        public void swapPkg(){
            System.out.println("换包装");
        }
    
        @Override
        public void changeNew(){
            this.swapMachine();
            super.swapHull();
            this.swapPkg();
        }
    
    }

      将包装后的新手机卖出新价格

    /**
     * 装饰器模式的测试
     * @author test11
     */
    public class Demo {
    
        public static void main(String[] args) {
            OldPhone phone1 = new NewPhone1();
            phone1.changeNew();
            System.out.println("价格1000");
    
            System.out.println("");
    
            OldPhone phone2 = new NewPhone2();
            phone2.changeNew();
            System.out.println("价格1500");
        }
    }

      

      实现2:定义旧手机以旧翻新接口

    /**
     * 旧手机对象
     * @author test11
     */
    public abstract class OldPhone {
    
        /**
         * 主要装饰的目的:以旧变新
         */
        public abstract void changeNew();
    
    }

      将旧手机更换下外壳,装饰成新手机

    /**
     * 装饰手机
     * @author test11
     */
    public class NewPhone extends OldPhone {
    
        public void swapHull(){
            System.out.println("换外壳");
        }
    
        @Override
        public void changeNew() {
            this.swapHull();
        }
    }

      创建一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能

    /**
     * @author test11
     */
    public abstract class Decorator extends OldPhone {
    
        OldPhone oldPhone;
    
        Decorator(OldPhone oldPhone){
            this.oldPhone = oldPhone;
        }
    
        @Override
        public void changeNew() {
            this.oldPhone.changeNew();
        }
    }

      把换零件和换包装的动作独立出来

    /**
     * 更换零件
     * @author test11
     */
    public class SwapMachine extends Decorator{
    
        SwapMachine(OldPhone oldPhone) {
            super(oldPhone);
        }
    
        public void swapMachine(){
            System.out.println("更换零件");
        }
    
        @Override
        public void changeNew() {
            super.changeNew();
            this.swapMachine();
        }
    }
    /**
     * 更换包装
     * @author test11
     */
    public class SwapPkg extends Decorator{
    
        SwapPkg(OldPhone oldPhone) {
            super(oldPhone);
        }
    
        public void swapPkg(){
            System.out.println("更换包装");
        }
    
        @Override
        public void changeNew() {
            super.changeNew();
            this.swapPkg();
        }
    }

      将包装后的新手机卖出新价格

    /**
     * 测试装饰者模式
     * @author test11
     */
    public class Demo {
    
        public static void main(String[] args) {
            OldPhone oldPhone = null;
            oldPhone = new NewPhone();
    
            oldPhone = new SwapMachine(oldPhone);
            oldPhone = new SwapPkg(oldPhone);
    
            oldPhone.changeNew();
            System.out.println("价格1500");
        }
    }
  • 相关阅读:
    SpringMVC + Spring + MyBatis 学习笔记:遭遇order by 排序问题
    SpringMVC + Spring + MyBatis 学习笔记:SpringMVC和Spring一同工作的时候,AOP事务管理不起作用的解决方法
    SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法
    SpringMVC + Spring + MyBatis 学习笔记:为MyBatis增加打印SQL功能 (最简化配置)
    [转]大部分人努力程度之低,根本轮不到拼天赋
    String内存陷阱简介
    同为程序员 为什么我的工资最低
    在程序员的眼里,用户是这样使用他们开发的软件的
    POI怎么和项目结合起来使用
    uploadify
  • 原文地址:https://www.cnblogs.com/jiyukai/p/14790172.html
Copyright © 2011-2022 走看看