24°

设计模式-装饰器模式

设计模式-装饰器模式

定义

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

}

}

扩展

使用场景

  • 需要扩展一个类的功能,或给类增加附加功能(如果没有该类的源码或者不修改原代码的情况)
  • 需要动态给一个对象增加功能,并可以动态的撤销
  • 需要为一批对象改装或者假装功能

本文由【木】发布于开源中国,原文链接:https://my.oschina.net/u/4212153/blog/3159043

全部评论: 0

    我有话说: