设计模式之装饰者模式12
背景
有一次考试,小明考了60分,然后学校出了一个成绩单,要家长签字。60分,王老汉肯定不签字。这时,需要加两个装饰。
1:最高分是70分,我考了60分。
2:我排名从40到30名。
类图
代码实现
学校给的报告单
public abstract class SchoolReport {
public abstract void report();
public abstract void sign(String name);
}
四年级真实的成绩单
public class FourGradeReport extends SchoolReport{
@Override
public void report() {
System.out.println("我考了60分。");
}
@Override
public void sign(String name) {
System.out.println("家长签字:"+name);
}
}
抽象出来的装饰类
public abstract class Decorator extends SchoolReport{
private SchoolReport sr;
public Decorator(SchoolReport sr) {
this.sr = sr;
}
@Override
public void report() {
this.sr.report();
}
@Override
public void sign(String name) {
this.sr.sign(name);
}
}
高分的修饰类
public class HighScoreReport extends Decorator{
public HighScoreReport(SchoolReport sr) {
super(sr);
}
public void reportHigh() {
System.out.println("最高分是70");
}
@Override
public void report() {
super.report();
this.reportHigh();
}
}
排名的修饰类
public class SortScoreReport extends Decorator{
public SortScoreReport(SchoolReport sr) {
super(sr);
}
public void reportSort() {
System.out.println("排名从40到30名");
}
@Override
public void report() {
super.report();
this.reportSort();
}
}
给王老汉看报告,并要求签字
public class Client {
public static void main(String[] args) {
SchoolReport sr = new FourGradeReport();
sr = new HighScoreReport(sr);
sr = new SortScoreReport(sr);
sr.report();
sr.sign("王老汉");
}
}
运行结果
我考了60分。
最高分是70
排名从40到30名
家长签字:王老汉