1、装饰模式的定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
2、代码示例
/** * 抽象成绩单 */ public abstract class SchoolReport { //成绩单主要展示成绩情况 public abstract void report(); //成绩单要家长签字 public abstract void sign(String name); }
/** * 四年级成绩单 */ public class FouthGradeSchoolReport extends SchoolReport { @Override public void report() { //成绩单的格式是这个样子的 System.out.println("尊敬的XXX家长:"); System.out.println(" ......"); System.out.println(" 语文 62 数学65 体育 98 自然 63"); System.out.println(" ......."); System.out.println(" 家长签名: "); } @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; } //成绩单还是要被看到的 public void report(){ this.sr.report(); } //看完还是要签名的 public void sign(String name){ this.sr.sign(name); } }
/** * 最高成绩修饰 */ 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(); } }
/** * 排名情况修饰 */ 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(); } }
/** * 老爸查看成绩单 */ 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("老三"); //我叫小三, 老爸当然叫老三 } }
3、使用场景: 需要扩展一个类的功能,或给一个类增加附加功能。