设计模式之装饰器(decorator)

定义 装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。

装饰器模式的结构

装饰器模式以对客户透明的方式动态的给一个对象附加上更多的责任。 换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同。 装饰器模式可以在不是用创造更多子类的情况下,将对象的功能加以拓展。

装饰器模式中的角色

  • 抽象构件(Project)角色:给出一个抽象接口,已规范准备接收附加责任的对象。
  • 具体构件(Employe)角色:定义一个将要接收附加责任的类
  • 装饰(Manager)角色:持有一个构件(Project)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰(ManagerA, ManagerB)角色:负责给构件对象“贴上”附加的责任。

Java 装饰器模式示例

public interface Project {
	public void doCoding();
}

// 程序员
public class Employe implements Project {
	public void doCoding() {
		LogHelper.log("程序员收到需求, 脸色大变,但还是开始了编码,刚开始很慢,后来在有漂亮的鼓励师加持下,编码速度增加N多倍,提前一周完成代码开发.....");
	}
}

// 项目经理
public class Manager implements Project {
	private Project mWorker;
	public Manager(Project worker)
	{
		this.mWorker = worker;
	}
	public void doCoding() {
		start();
		mWorker.doCoding();
		finish();
	}
	public void start()
	{
	}
	public void finish()
	{
	}
}

public class ManagerA extends Manager {
	public ManagerA(Project project)
	{
		super(project);
	}
	public void start()
	{
		 LogHelper.log("项目经理A 在做需求分析, 搞了一堆的需求....");
	}
	public void finish()
	{
		LogHelper.log("项目经理A 在做收尾工作");
	}
}

public class ManagerB extends Manager {
	public ManagerB(Project project)
	{
		super(project);
	}
	public void start()
	{
		 LogHelper.log("项目经理B 在做需求分析, 搞了一堆的需求....");
	}
	public void finish()
	{
		LogHelper.log("项目经理B 在做收尾工作");
	}
}

public class App {
	public static void main(String[] args)
	{
		 Project employe = new Employe();       
		 Project managerA = new ManagerA(employe);
		 Project managerB = new ManagerB(employe);

		 managerA.doCoding();
		 managerB.doCoding();
	}
}

运行结果

【www.pangugle.com】-  项目经理A 在做需求分析, 搞了一堆的需求....
【www.pangugle.com】-  程序员收到需求, 脸色大变,但还是开始了编码,刚开始很慢,后来在有漂亮的鼓励师加持下,编码速度增加N多倍,提前一周完成代码开发.....
【www.pangugle.com】-  项目经理A 在做收尾工作
【www.pangugle.com】-  项目经理B 在做需求分析, 搞了一堆的需求....
【www.pangugle.com】-  程序员收到需求, 脸色大变,但还是开始了编码,刚开始很慢,后来在有漂亮的鼓励师加持下,编码速度增加N多倍,提前一周完成代码开发.....
【www.pangugle.com】-  项目经理B 在做收尾工作