设计模式-装饰器模式

旧城冷巷雨未停 提交于 2020-02-26 06:33:07

设计模式-装饰器模式

定义

动态的给一个对象添加一些额外的职责。从功能上来说,类似于子类扩展父类,但装饰器模式更加灵活(可以独立于需要扩展的组件)
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("好!");

	}
}

扩展

使用场景

  • 需要扩展一个类的功能,或给类增加附加功能(如果没有该类的源码或者不修改原代码的情况)
  • 需要动态给一个对象增加功能,并可以动态的撤销
  • 需要为一批对象改装或者假装功能
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!