文章目录
装饰模式简介:
装饰模式就是动态地给一个对象添加一些额外的职责,在一个类的基础上,在不改变原有类的情况下,在外部对类的功能进行扩展。
装饰模式中出现的角色
Component抽象构件
Component
是一个接口或者是抽象类, 就是我们定义我们最核心的对象。
ConcreteComponent
ConcreteComponent是最核心、 最原始、 最基本的接口或抽象类的实现, 我们所要装饰的就是这个实现类。
Decorator
实现Compoent,在它的属性里必然有一个private变量指向Component抽象构件。
具体装饰角色
ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类, 也就是把最核心的、 最
原始的、 最基本的东西(ConcreteComponent )装饰成其他东西。
具体实现用例
代码如下:
package Decorator;
public abstract class SchoolReport {
//成绩单主要展示的就是你的成绩情况
public abstract void report();
//成绩单要家长签字
public abstract void sign(String name);
}
package Decorator;
public class FouthGradeSchoolReport extends SchoolReport {
public void report() {
System.out.println("尊敬的XXX家长:");
System.out.println(" ......");System.out.println(" 语文 62 数学65 体育 98 自然 63");
System.out.println(" .......");
System.out.println(" 家长签名: ");
}
//家长签名
public void sign(String name) {
System.out.println("家长签名为: "+name);
}
}
package Decorator;
public abstract class Decorator extends SchoolReport{
//首先我要知道是哪个成绩单
private SchoolReport sr;
//构造函数, 传递成绩单过来
public Decorator(SchoolReport sr){
this.sr = sr;
}//成绩单还是要被看到的
public void report(){
this.sr.report();
}//看完还是要签名的
public void sign(String name){
this.sr.sign(name);
}
}
package Decorator;
public class HighScoreDecorator extends Decorator {
//构造函数
public HighScoreDecorator(SchoolReport sr){
super(sr);
}//我要汇报最高成绩
private void reportHighScore(){
System.out.println("这次考试语文最高是75, 数学是78, 自然是80");
}//我要在老爸看成绩单前告诉他最高成绩, 否则等他一看, 就抡起扫帚揍我, 我哪里还有机会说啊
@Override
public void report(){
this.reportHighScore();
super.report();
}
}
package Decorator;
public class SortDecorator extends Decorator {
//构造函数
public SortDecorator(SchoolReport sr){super(sr);
} //告诉老爸学校的排名情况
private void reportSort(){
System.out.println("我是排名第38名...");
} //老爸看完成绩单后再告诉他, 加强作用
@Override
public void report(){
super.report();
this.reportSort();
}
}
package Decorator;
public class Father {
public static void main(String[] args) {
//把成绩单拿过来
SchoolReport sr;
//原装的成绩单
sr = new FouthGradeSchoolReport();
//加了最高分说明的成绩单
sr = new HighScoreDecorator(sr);
//又加了成绩排名的说明
sr = new SortDecorator(sr);
//看成绩单
sr.report();
//然后老爸一看, 很开心, 就签名了
sr.sign("父亲签名");
}
}
执行结果:
调用链分析
SortDecorator调用父类构造方法,将HighScoreDecorator实例作为Decorator 的SchoolReport 实现。
所以调用SortDecorator的report方法,会进入Decorator 的report方法,然后在里面执行this.sr.report();这里的this.sr根据客户端放入的顺序,实际上是HighScoreDecorator对象实例。
然后进入HighScoreDecorator的report()然后执行this.reportHighScore(){相当于扩展的功能},然后调用super.report()最后会执行原始的FouthGradeSchoolReport的report(){这个方法是我们本身要执行的最朴素的方法},至此调用链过程分析完了。
所以进行总结:
装饰类和被装饰类可以独立发展, 而不会相互耦合,装饰模式可以动态地扩展一个实现类的功能。
装饰模式使用场景:
1:需要扩展一个类的功能, 或给一个类增加附加功能。
2:需要为一批的兄弟类进行改装或加装功能。