Decorator Pattern
Attach additional responsibilities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for extending functionality.(动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生成子类更为灵活)
不认识的单词
dynamically adv 动态的
alternative n 可供选择的事务
functionality n 功能
例子
小时候交成绩单给老爸,语文:60 数学:68 自然:87,要知道这样的成绩在小学根本拿不出手,要家长签名那是不可能的,于是乎需要装饰一下,就说"这次这次考试语文最高70,数学最高70,自然最高100",完了再加一句,我排名多少等等。。。。。
也就是说,在原来的基础上再添加俩个功能修饰一下,有人可能会直接使用子类继承来写,但是这样不利于多个,万一有变,遵循开闭原则,在原来的基础上再改,该如何实现呢?
public abstract class SchoolReport {
public abstract void report();
public abstract void sign(String name);
}
public class FourthGradeSchoolReport extends SchoolReport {
@Override
public void report() {
System.out.println("尊重的xxx");
System.out.println("...............");
System.out.println("语文:60 数学:68 自然:87");
}
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);
}
}
分析Decorator类
1.为何要继承SchoolReport? 如果不继承的话,下面具体修饰类继承,并且有一个SchoolReport成员,这样每次修饰需要把俩个方法都需要实现俩个方法super.xxx(),这样代码量增加了。
2.为何需要一个SchoolReport成员? 如果没有,那么就无法传递,实现多层包装。
ok,搞定了这个,那么下面就是按照模板来画圆了。
public class HighScoreDecorator extends Decorator {
public HighScoreDecorator(SchoolReport sr) {
super(sr);
}
private void reportHighScore(){
System.out.println("这次考试语文最高70,数学最高70,自然最高100");
}
@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 static void main(String[] args) {
SchoolReport sr;
sr=new FourthGradeSchoolReport();
sr=new HighScoreDecorator(sr);
sr=new SortDecorator(sr);
sr.report();
sr.sign("Dad");
//这样老爸自然就开心的签字了
}
悟
将继承发挥到了极致,必须要懂重写的含义,问题不大,一般这样做的应该不多。
优点
不会耦合
动态扩展功能
缺点
如果最里面的修饰出现了问题,那么问题来了,多蛋疼。所以使用的时候尽量减少修饰类的数量,否则...
使用场景
扩展类功能
动态的增加类功能
为兄弟类进行改装或加装
我是菜鸟,我在路上。