- 定义:为旧有的类添加新的功能,如小菜穿衣。若旧类为A,要为A添加新功能。装饰模式比生成子类更为灵活。
- 抽象装饰类Decorator继承A的父类且包含一个A父类属性。
- 具体的装饰类Decorator1继承抽象装饰类Decorator,且覆盖旧类A的某个要修改的方法(在super.method()前或后增加要增加的功能)
- 具体的装饰类Decorator2继承抽象装饰类Decorator,且覆盖旧类A同一个要修改的方法(在super.method()前或后增加要增加的功能)
- 客户端类中new旧类A的父类对象,并依次赋值为new A(),new Decorator1(),new Decorator2()
- 再执行A对象的被装饰的方法即可
- 代码:
//成绩单父类,包含获取成绩信息、家长签字功能
public abstract class SchoolReport {
public abstract void getReportInfo();
public abstract void parentSign(String parentName);
}
public class ForthGradeSchoolReport extends SchoolReport{
public void getReportInfo() {
System.out.println("尊敬的XXX家长,您儿子的成绩为:");
System.out.println("语文 62 数学65 体育 98 自然 63");
}
public void parentSign(String parentName) {
System.out.println("家长签字为:"+parentName);
}
}
public abstract class Decorator extends SchoolReport{
private SchoolReport schoolReport;
public Decorator(SchoolReport schoolReport) {
this.schoolReport = schoolReport;
}
public void getReportInfo() {
schoolReport.getReportInfo();
}
public void parentSign(String parentName) {
schoolReport.parentSign(parentName);
}
}
public class ScoreDecorator extends Decorator{
public ScoreDecorator(SchoolReport schoolReport) {
super(schoolReport);
}
private void sugarScore(){
System.out.println("这次考试语文最高是75,数学是78,自然是80");
}
public void getReportInfo() {
System.out.println("装饰器1开始11111111111111");
sugarScore();//此为要装饰的方法1
super.getReportInfo();
System.out.println("装饰器1结束11111111111111");
}
}
public class SortDecorator extends Decorator{
public SortDecorator(SchoolReport schoolReport) {
super(schoolReport);
}
private void sugarSort(){
System.out.println("我是排名第38名...");
}
public void getReportInfo() {
System.out.println("装饰器2开始222222222222222222222");
sugarSort();//此为要装饰的方法2
super.getReportInfo();
System.out.println("装饰器2结束222222222222222222222");
}
}
public class Client {
public static void main(String[] args){
SchoolReport schoolReport;
schoolReport = new ForthGradeSchoolReport();
schoolReport = new ScoreDecorator(schoolReport);//此为要装饰到原类中的新功能1
schoolReport = new SortDecorator(schoolReport);//此为要装饰到原类中的新功能2
schoolReport.getReportInfo();
schoolReport.parentSign("家长的名字");
}
}