设计模式回顾系列文章: 主要针对工作中常用常见的设计模式进行整理、总结,同时分享以供大家拍砖。
------------------------------------------------
装饰者模式:
动态地给一个对象添加职责,可以无需创建子类,而扩展一个对象的功能。
适用情景:各种可选的功能在另一个肯定要执行的功能之前或者之后执行。
实现:创建一个抽象类来表示原类和要添加到这个类的新功能。在装饰类中,将对新功能的调用放在对紧随其后对象的调用之前或之后,以获得正确的顺序。
举例:在类使用时如果有多种组合情况时,例如:蛋糕类 -> 奶油蛋糕、巧克力蛋糕、果仁蛋糕、奶油巧克力蛋糕、奶油果仁蛋糕.....如果为每一种组合都建立一个子类的话,则需要很多子类,这时可以考虑装饰者模式。
程序实现:
接口:
public interface Work {
public void working();
}
原始实现类:
public class Programmer implements Work{
public void working() {
System.out.println("编写程序中...");
}
}
装饰类1:
public class ProgrammerDecorator implements Work{
private Work work;
public ProgrammerDecorator(Work work){
this.work = work;
}
public void working() {
designing();
work.working();//装饰顺序可变...
debuging();
}
//新增加的装饰性方法:设计程序
public void designing(){
System.out.println("设计程序中...");
}
//新增加的装饰性方法:修改Bug
public void debuging(){
System.out.println("修改Bug中...");
}
}
装饰类2:
public class TeamLeaderDecorator implements Work{
private Work work;
public TeamLeaderDecorator(Work work){
this.work=work;
}
public void working() {
allotTasks();
work.working();
}
//分配任务
public void allotTasks(){
System.out.println("分配任务");
}
}
程序入口:
public static void main(String[] args) {
Work programmer=new Programmer();
System.out.println("未被装饰时:");
programmer.working();//未被装饰时
System.out.println();
System.out.println("单重装饰后:");
ProgrammerDecorator pd=new ProgrammerDecorator(programmer);
pd.working();
System.out.println();
System.out.println("多重装饰后:");
TeamLeaderDecorator tld=new TeamLeaderDecorator(new ProgrammerDecorator(programmer));
tld.working();
}
举例:IO类库大量使用了装饰者模式,例如BufferedReader包装FileReader、BufferedInputStream包装FileInputStream等等,实现动态地给对象添加职责。