Java与模式:装饰(Decorator)模式

2014-11-23 21:25:57 · 作者: · 浏览: 7
装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。 装饰模式在Java种使用也很广泛,比如我们在重新定义按钮、对话框等时候,实际上已经在使用装饰模式了。装饰模式最浅显的例子是相片-相框的例子。 一、原理图

vcfJq6OoUHJvamVjdKOpo7q4+LP20ru49r3Tv9qjrNLUuea3tte8sbi908rVuL2809TwyM61xLbUz/MKCr7fzOW5ubz+vcfJq6OoRW1wbG95ZaOpo7q2qNLl0ru49r2r0qq908rVuL2809TwyM61xMDgCgrXsMrOvcfJq6OoTWFuYWdlcqOpo7qz1tPQ0ru49rm5vP621M/ztcTKtcD9o6yyorao0uXSu7j20+uz6c/zubm8/r3Tv9rSu9bCtcS907/aCgq+38zl17DKzr3HyaujqE1hbmFnZXJBoaJNYW5hZ2VyQqOpo7q4utTwuPi5ubz+ttTP86GwzPnJz6GxuL2807XE1PDIzgoKIAoKtv6hos/Cw+bNqLn90ru49sjtvP7P7sS/wP3X08C0y7XD99ewys7Eo8q9tcTKudPDCgq5/bPMysfV4tH5tcSjugoKz+7Ev76twO2907W90ru49s/uxL+jrM/uxL/X7tbV0qrN6rPJseDC66GjCgrP7sS/vq3A7b3Ttb3P7sS/uvOjrM/I1/bQqcewxtq1xLmk1/ejqLHIyOfQ6Mfzt9bO9qGiyei8xqOpo6zIu7rzvaux4MLruaTX986vxcm4+LT6wuu5pMjLo6y0+sLruaTIy7jJzeq686Osz+7Ev76twO3X9s/uxL+1xMrVzrK5pNf3oaMKCiAKCsq1z9a0+sLryOfPwqO6CjxwcmUgY2xhc3M9"brush:java;">package com.dashu.decorator; /** * 项目接口 * */ public interface Project { /** * 写代码 */ public void doCoding(); }

package com.dashu.decorator;

/**
 * 代码工人
 * */
public class Employe implements Project {

	//程序员编码
	@Override
	public void doCoding() {
		System.out.println("代码工人 在编写代码,加班编啊编啊,终于编完了!");
	}
}

package com.dashu.decorator;

/**
 *项目经理
 * */
public class Manager implements Project {
	private Project project; // 实际上存放的是代码工人对象

	public Manager(Project project) {
		this.project = project;
	}

	@Override
	public void doCoding() {
		// 项目经理开始新的工作
		startNewWork();
	}

	/**
	 * 模板:定义项目经理自己的事情
	 */
	public void startNewWork() {
		// 项目经理在做早期工作
		doEarlyWork();
		// 项目经理很牛,做完需求和设计后,直接将编码委派给代码工人干
		project.doCoding();
		// 项目经理在做收尾工作
		doEndWork();
	}

	/**
	 * 项目经理自己的事情:做早期工作
	 */
	public void doEarlyWork() {
	}

	/**
	 * 项目经理做收尾工作
	 */
	public void doEndWork() {
	}
}

package com.dashu.decorator;

/**
 * 项目经理A
 * */
public class ManagerA extends Manager {

	public ManagerA(Project project) {
		super(project);
		// TODO Auto-generated constructor stub
	}

	/**
	 * 项目经理自己的事情:做早期工作
	 */
	public void doEarlyWork() {
		System.out.println("项目经理A 在做需求分析");
		System.out.println("项目经理A 在做架构设计");
		System.out.println("项目经理A 在做详细设计");
	}

}

package com.dashu.decorator;

/**
 * 项目经理B
 * */
public class ManagerB extends Manager {
	public ManagerB(Project project) {
		super(project);
	}

	/**
	 * 项目经理自己的事情:做早期工作
	 */
	public void doEarlyWork() {
		System.out.println("项目经理B 在做需求分析");
		System.out.println("项目经理B 在做详细设计");
	}

	/**
	 * 项目经理做收尾工作
	 */
	public void doEndWork() {
		System.out.println("项目经理B 在做收尾工作");
	}
}