设计模式-装饰器模式
定义
动态的给一个对象添加一些额外的职责。从功能上来说,类似于子类扩展父类,但装饰器模式更加灵活(可以独立于需要扩展的组件)
UML
优点
- 独立于被扩展的组件独立发展,不耦合
- 替代继承
- 动态灵活的实现按照多层、组合、顺序、的封装
缺点
- 过多层的装饰难于理解,剥开层层装饰才能看到最里层,不好排查问题,不易阅读
实现
- Component 组件
public interface Report {
void report();
void reviews(String reviewsResult);
}
- ConcreteComponent
public class YearSummaryReport implements Report {
@Override
public void report() {
System.out.println("今年销售额 一千万");
}
@Override
public void reviews(String reviewsResult) {
System.out.println("报告点评: " + reviewsResult);
}
}
- AbstraceDecoretor
public abstract class Decorator implements Report {
private Report report;
public Decorator(Report report) {
this.report = report;
}
@Override
public void report() {
this.report.report();
}
@Override
public void reviews(String reviewsResult) {
this.report.reviews(reviewsResult);
}
}
- 具体的装饰
public class HighProfitDecorator extends Decorator {
public HighProfitDecorator(Report report) {
super(report);
}
@Override
public void report() {
super.report();
System.out.println("利润 一百万");
System.out.println("利润增长 20%");
}
}
public class CompareWithYearDecorator extends Decorator {
public CompareWithYearDecorator(Report report) {
super(report);
}
@Override
public void report() {
super.report();
System.out.println("比去年增加了一百万的销售额");
System.out.println("增长达到10%");
}
}
- client
public class Boss {
public static void main(String[] args) {
YearSummaryReport yearSummaryReport = new YearSummaryReport();
Decorator decorator = null;
//第一次装饰
decorator = new HighProfitDecorator(yearSummaryReport);
//第二次装饰(在第一层的基础上装饰 类似洋葱外壳)
decorator = new CompareWithYearDecorator(decorator);
decorator.report();
decorator.reviews("好!");
}
}
扩展
使用场景
- 需要扩展一个类的功能,或给类增加附加功能(如果没有该类的源码或者不修改原代码的情况)
- 需要动态给一个对象增加功能,并可以动态的撤销
- 需要为一批对象改装或者假装功能
来源:oschina
链接:https://my.oschina.net/u/4212153/blog/3159043