1700464861
好,你也看到通过继承情况确实出现了问题,类爆炸,类的数量激增,光写这些类不累死你才怪,而且还要想想以后维护怎么办,谁愿意接收这么一大摊本质相似的代码维护工作?并且在面向对象的设计中,如果超过两层继承,你就应该想想是不是出设计问题了,是不是应该重新找一条康庄大道了,这是经验值,不是什么绝对的,继承层次越多以后的维护成本越多,问题这么多,那怎么办?好办,我们定义一批专门负责装饰的类,然后根据实际情况来决定是否需要进行装饰,类图稍作修正,如图17-4所示。
1700464862
1700464863
1700464864
1700464865
1700464866
图17-4 增加专门的装饰类图
1700464867
1700464868
增加一个抽象类和两个实现类,其中Decorator的作用是封装SchoolReport类,如果大家还记得代理模式,那么很容易看懂这个类图,装饰类的作用也就是一个特殊的代理类,真实的执行者还是被代理的角色FouthGradeSchoolReport,如代码清单17-6所示。
1700464869
1700464870
代码清单17-6 修饰的抽象类
1700464871
1700464872
public abstract class Decorator extends SchoolReport{
1700464873
1700464874
//首先我要知道是哪个成绩单
1700464875
1700464876
private SchoolReport sr;
1700464877
1700464878
//构造函数,传递成绩单过来
1700464879
1700464880
public Decorator(SchoolReport sr){
1700464881
1700464882
this.sr=sr;
1700464883
1700464884
}
1700464885
1700464886
//成绩单还是要被看到的
1700464887
1700464888
public void report(){
1700464889
1700464890
this.sr.report();
1700464891
1700464892
}
1700464893
1700464894
//看完还是要签名的
1700464895
1700464896
public void sign(String name){
1700464897
1700464898
this.sr.sign(name);
1700464899
1700464900
}
1700464901
1700464902
}
1700464903
1700464904
看到没,装饰类还是把动作的执行委托给需要装饰的对象,Decorator抽象类的目的很简单,就是要让子类来封装SchoolReport的子类,怎么封装?重写report方法!先看HighScoreDecorator实现类,如代码清单17-7所示。
1700464905
1700464906
代码清单17-7 最高成绩修饰
1700464907
1700464908
public class HighScoreDecorator extends Decorator{
1700464909
1700464910
//构造函数
[
上一页 ]
[ :1.700464861e+09 ]
[
下一页 ]