[size=medium]装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
优点:
1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.装饰模式可以动态地扩展一个实现类的功能。
缺点:多层的装饰是比较复杂的。尽量减少装饰类的数量,以便降低系统的复杂度。
使用场景:
1.需要扩展一个类的功能,或给一类增加附加功能。
2.需要动态地给一个对象增加功能,这些功能更可以再动态地撤销。
3.需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
[/size]
优点:
1.装饰类和被装饰类可以独立发展,而不会相互耦合。
2.装饰模式是继承关系的一个替代方案。
3.装饰模式可以动态地扩展一个实现类的功能。
缺点:多层的装饰是比较复杂的。尽量减少装饰类的数量,以便降低系统的复杂度。
使用场景:
1.需要扩展一个类的功能,或给一类增加附加功能。
2.需要动态地给一个对象增加功能,这些功能更可以再动态地撤销。
3.需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
[/size]
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("老三");
}
}