装饰模式
装饰模式也称包装模式:动态的将新功能附加到对象上(被装饰者放入装饰者内)
uml图示
其中,Component是抽象构件,定义一个对象接口,可以给这些对象动态地添加职责; ConreteComponent定义一个具体对象,也可以给这个对象添加一些职责;Decorator是装饰抽象类, 实现接口或抽象方法;ConreteDecorator是具体装饰对象,起到给Component添加职责的功能。
例:
项目经理接到一个项目,项目最终要完成编码的工作。项目经理接到项目后,先做些前期的工作(比如需求分析、设计),然后将编码工作委派给程序员,程序员干完后,项目经理做项目的收尾工作。
代码实现
package 装饰模式;
public interface Project {
/**
* 写代码
*/
void doCoding();
}
package 装饰模式;
/**
* 员工
*/
public class Employe implements Project {
public void doCoding() {
System.out.println("员工编写代码");
}
}
package 装饰模式;
/**
* 项目经理
*/
public class Manager implements Project{
private Project project;
public Manager(Project project){
this.project = project;
}
@Override
public void doCoding() {
//经理工作
starkNewWork();
}
public void starkNewWork() {
//经理做早起工作
doEarlyWork();
//经理将具体实现交给工人
project.doCoding();
//经理做收尾工作
doEndWork();
}
public void doEndWork() {
}
public void doEarlyWork() {
}
}
package 装饰模式;
public class ManagerA extends Manager{
public ManagerA(Project project) {
super(project);
}
/**
* 项目经理自己的事情:做早期工作
*/
public void doEarlyWork() {
System.out.println("项目经理A 在做需求分析");
System.out.println("项目经理A 在做架构设计");
System.out.println("项目经理A 在做详细设计");
}
}
package 装饰模式;
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 在做收尾工作");
}
}
package 装饰模式;
public class Client {
public static void main(String args[]) {
Project employe = new Employe(); //代码工人
Project managerA = new ManagerA(employe); //项目经理
Project managerB = new ManagerB(employe); //项目经理
//以经理的名义将编码完成,功劳都是经理的,实际编码的是工人(包装与被包装的关系)
managerA.doCoding();
System.out.println();
managerB.doCoding();
}
}
运行效果: