设计模式读书笔记-装饰模式

2016-08-21
读书笔记
  • 定义:为旧有的类添加新的功能,如小菜穿衣。若旧类为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("家长的名字");

    }

}

Kommentare: