【设计模式】17.装饰模式
装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
优点:
1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.装饰模式可以动态地扩展一个实现类的功能。
缺点:多层的装饰是比较复杂的。尽量减少装饰类的数量,以便降低系统的复杂度。
使用场景:
1.需要扩展一个类的功能,或给一类增加附加功能。
2.需要动态地给一个对象增加功能,这些功能更可以再动态地撤销。
3.需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
package com.syc.designpatterns.chapter17;public abstract class SchoolReport {// 成绩单主要展示的就是你的成绩情况public abstract void report();// 成绩单要家长签字,这个是最要命的public abstract void sign(String name);}
package com.syc.designpatterns.chapter17;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 com.syc.designpatterns.chapter17;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 com.syc.designpatterns.chapter17;public class HighScoreDecorator extends Decorator {// 构造函数public HighScoreDecorator(SchoolReport sr){super(sr);}// 我要汇报最高成绩private void reportHighScore(){System.out.println("这次考试语文最高是75,数学是78,自然是80");}// 我要在老爸看成绩单签告诉他最高成绩,否则等他一看,就抡起扫帚揍我,我哪里还有机会说啊public void report() {this.reportHighScore();super.report();}}
package com.syc.designpatterns.chapter17;public class SortDecorator extends Decorator {// 构造函数public SortDecorator(SchoolReport sr) {super(sr);}// 告诉老爸学校的排名情况private void reportSort(){System.out.println("我是排名第38名...");}// 老爸看完成绩单后再告诉他,加强作用public void report(){super.report();this.reportSort();}}
package com.syc.designpatterns.chapter17;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("老三");}}