装饰模式

装饰模式的定义:
Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative
to subclassing for extending funcitionlity.
动态的给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。

在类图中,有四个角色需要说明:
Component抽象构件:Component是一个接口或者是抽象类,就是定义我们最核心的对象,就是最原始的对象;在装饰模式中,必然有一个最基本,最核心
最原始的接口或抽象类充当Component抽象构件
ConcreteComponent具体构件:ConcreteComponent是最核心,最原始,最基本的接口或抽象类的实现
Decorator装饰角色:在它的属性里必然有一个private变量指向Component抽象构件
具体装饰角色:就是把最核心,最原始的,最基本的东西装饰成其他的东西

//Component抽象构件
public
abstract class SchoolReport { public abstract void report(); public abstract void sign(); }
//具体构件
public class FouthGradeSchoolReport extends SchoolReport { @Override public void report() { System.out.println("尊敬的XXX家长:"); System.out.println("...."); System.out.println("语文 62 数学 65 体育 98 自然 63"); System.out.println("...."); System.out.println(" 家长签字:"); } @Override public void sign() { System.out.println(" 家长签字:XXXX"); } }
//抽象装饰者
public abstract class Decorator extends SchoolReport { private SchoolReport schoolReport;//在它的属性里必然有一个private变量指向Component抽象构件     //通过构造函数传递被修饰者 public Decorator(SchoolReport schoolReport) { this.schoolReport = schoolReport; } @Override public void report() { this.schoolReport.report();//委托给被修饰者执行 } @Override public void sign() { this.schoolReport.sign();//委托给被修饰者执行 } } public class HighScoreDecorator extends Decorator { public HighScoreDecorator(SchoolReport schoolReport) { super(schoolReport); } private void reportHighScore() { System.out.println("报告最高分数..."); } @Override public void report() { this.reportHighScore();//修饰 super.report();//委托给被修饰者执行 } } public class SortDecorator extends Decorator { public SortDecorator(SchoolReport schoolReport) { super(schoolReport); } private void sort() { System.out.println("排名第三..."); } @Override public void report() { this.sort(); super.report(); } } public class Father { public static void main(String[] args) { SchoolReport schoolReport=new FouthGradeSchoolReport(); schoolReport=new HighScoreDecorator(schoolReport); schoolReport=new SortDecorator(schoolReport); schoolReport.report(); schoolReport.sign(); } }

装饰模式的优点:
1.装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,就是Component类无须知道Decorator类,Decorator类是从外部来扩展Component类功能
,而Decorator也不用知道具体的构件。
2.装饰模式是继承关系的一个替代方案。不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。
3.装饰模式可以动态的扩展一个实现类的功能
缺点:多层装饰模式是比较复杂的

使用场景:
1.需要扩展一个类的功能,或给一个类增加附加功能
2.需要动态地给一个对象增加功能,这些功能可以再动态的撤销
3.需要为一批的兄弟类进行功能改装或加装功能,当然是首选装饰模式

原文地址:https://www.cnblogs.com/liaojie970/p/5486451.html