• 装饰器模式


    结构型:Decorator(装饰器模式)

      装饰器模式:给爱用继承的人一个新的设计眼界。

      装饰器有别于一般的继承方式,通常使用对象包装的方式,来赋予新的职责和功能。如JDK中的IO流,InputStream就是一个抽象类,用IDE检索一下,很容易可以看出。   

      装饰器模式旨在不修改原类代码(对修改关闭)的前提下,赋予对象新的职责和能力(对扩展开放) 

      

    public interface Worker {
        void work();
    }
    
    class Programer implements Worker {
         public void work() {
             // TODO 我是个程序员,会编码
         }
    }
    
    class ProjectManager implements Worker {
         Worker  worker;
         public ProjectManager(Worker worker) {
              this.worker = worker;
         }
    
         public void work() {
             // TODO 我不仅是个(?取决于worker的实现),还是个项目管理员
         }
    }

     

      常用的有FileInputStream、BufferInputStream等。实际上就是在字节流处理的基础上再加一些如字符串处理的步骤。

     

      用非程序的语言来讲,装饰器有点像是:

      一个普通的人,一个漂亮的人,一个聪明的人。常见的,我们可能会觉得装饰器就像是项链、戒指等首饰,而实际上装饰器的设计模式更像是:戴着项链的和戴着戒指的人都是分开的。我们操作的都是人,而项链和戒指都是附加上去,而且可以不断叠加的。

      

      Demo:

      

    package top.gabin.oa.web.design.decorator;
    
    /**
     * 工作者
     * @author linjiabin on  16/4/30
     */
    public abstract class Worker {
        public void work() {
            System.out.println("我在工作,但我不知道能干嘛.");
        }
    }

     

    package top.gabin.oa.web.design.decorator;
    
    /**
     * 程序员
     * @author linjiabin on  16/4/30
     */
    public class Programmer extends Worker {
        @Override
        public void work() {
            System.out.println("我有程序员的技能,我会编码");
        }
    }
    /**
     * 项目管理人
     * @author linjiabin on  16/4/30
     */
    public class ProjectManager extends Worker {
        private Worker worker;
    
        public ProjectManager(Worker worker) {
            this.worker = worker;
        }
    
        @Override
        public void work() {
            worker.work();
            System.out.println("我懂得项目管理,是一个项目经理.");
        }
    }
    package top.gabin.oa.web.design.decorator;
    
    import org.junit.Test;
    
    /**
     * 装饰器测试类
     * @author linjiabin on  16/4/30
     */
    public class TestDecorator {
    
        @Test
        public void testWork() {
            // 程序员
            Programmer programmer = new Programmer();
            // 项目管理人
            ProjectManager pm = new ProjectManager(programmer);
            // 我是一个拥有程序员技能的项目管理人
            pm.work();
        }
    
    }

     

  • 相关阅读:
    python之socket编程
    python之异常处理
    面向对象进阶
    openstack的网络配置
    VLAN,GRE,VXLAN
    三节点搭建openstack-Mitaka版本
    矩阵转换
    判断区域相交的方法
    Centos 6.5 Multipath 初始配置
    CentOS开机自动运行程序的脚本
  • 原文地址:https://www.cnblogs.com/gabin/p/5448614.html
Copyright © 2020-2023  润新知