顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。
装饰器模式的应用场景:
1、需要扩展一个类的功能。
2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)
缺点:产生过多相似的对象,不易排错!
其中类的职责如下:
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
二、装饰模式的使用
Interface : Project
package edu.gof.decorator; //抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象 public interface Project { // 编写代码 void doCoding(); }
Class : Employe
package edu.gof.decorator; //具体构件角色(Employe):定义一个将要接收附加责任的类 public class Employe implements Project { // 真正的编码工作 public void doCoding() { System.out.println("码农:佛祖保佑,没有BUG"); } }
Class : Manager
package edu.gof.decorator; //装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口 public class Manager implements Project { // 实际上存放的是代码工人对象 private Project project; public Manager() { super(); } public Manager(Project project) { super(); this.project = project; } // 编码,总揽大局。装饰编码过程。 public void doCoding() { // 项目经理开始新的项目 this.startNewWork(); } // 模板:定义项目经理自己的事情 public void startNewWork() { // 项目经理在做早期工作 this.doEarlyWork(); // 早期工作完成,交由码农开始真正的编码工作 this.project.doCoding(); // 项目经理在做收尾工作 this.doEndWork(); } // 项目经理的早期工作 public void doEndWork() { } // 项目经理的收尾工作 public void doEarlyWork() { } }
Class : ManagerA
package edu.gof.decorator; public class ManagerA extends Manager { public ManagerA() { super(); } public ManagerA(Project project) { super(project); } public void doEarlyWork(){ System.out.println("项目经理A 在做需求分析"); System.out.println("项目经理A 在做架构设计"); System.out.println("项目经理A 在做详细设计"); } }
Class : ManagerB
package edu.gof.decorator; public class ManagerB extends Manager { public ManagerB() { super(); } public ManagerB(Project project) { super(project); } public void doEarlyWork(){ System.out.println("项目经理B 在做需求分析"); System.out.println("项目经理B 在做架构设计"); } public void doEndWork(){ System.out.println("项目经理B 在做收尾工作"); } }
Class : DecoratorTest
package edu.gof.decorator; public class DecoratorTest { public static void main(String[] args){ Project ManagerA = new ManagerA(new Employe()); ManagerA.doCoding(); System.out.println("------------------------"); Project ManagerB = new ManagerB(new Employe()); ManagerB.doCoding(); } }
Console :
项目经理A 在做需求分析 项目经理A 在做架构设计 项目经理A 在做详细设计 码农:佛祖保佑,没有BUG ------------------------ 项目经理B 在做需求分析 项目经理B 在做架构设计 码农:佛祖保佑,没有BUG 项目经理B 在做收尾工作
啦啦啦