装饰器模式

结构型: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();
    }

}

 

 

posted @ 2016-04-30 13:01  gabin  阅读(128)  评论(0编辑  收藏  举报