• 装饰者模式


      装饰器模式(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");
        }
    }
  • 相关阅读:
    笔记手动排序
    笔记手动分页
    Spring定时任务Quartz配置之手动设置
    java 日期处理
    SQL Case when 的使用方法
    Hibernate八大类HQL查询集合
    Spring定时任务Quartz配置
    各个浏览器显示版本(IE,火狐)
    js转译html标签
    定时备份SQL SERVER的数据库并且把备份文件复制到另外一台服务器
  • 原文地址:https://www.cnblogs.com/jiyukai/p/14790172.html
Copyright © 2020-2023  润新知