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