装饰模式

来源:互联网 发布:每日一文 知乎 编辑:程序博客网 时间:2024/04/29 13:45

Attach additional responsibities to an object dynamically keeping the same interface. Decorators provide a flexible alternative to subclassing for ectending functionality.

装饰模式的通用类图

这里写图片描述

装饰模式的通用源码

  • 抽象构件

    public abstract class Component {    public abstract void operate();}
  • 具体构件

    public class ConcreteComponent extends Component {    @Override    public void operate() {        System.out.println("do Something");    }}
  • 抽象装饰类

    public abstract class Decorator extends Component {    private Component component;    //通过构造函数传递修饰者    public Decorator(Component _component) {        this.component =  _component;    }    //委托给被修饰者执行    @Override    public void operate() {        this.component.operate();    }}
  • 具体装饰类1

    public class ConcreteDecorator1 extends Decorator {    public ConcreteDecorator1(Component _component) {        super(_component);    }    //定义自己的方法    private void method1() {        System.out.println("method1 --->");    }    @Override    public void operate() {        this.method1();        super.operate();    }}
  • 具体装饰者类2

    public class ConcreteDecorator2 extends Decorator {    public ConcreteDecorator2(Component _component) {        super(_component);    }    //定义自己的方法    private void method2() {        System.out.println("method2 =======>");    }    @Override    public void operate() {        this.method2();        super.operate();    }}
  • 场景类

    public class Client {    public static void main(String[] args) {        Component component = new ConcreteComponent();        component = new ConcreteDecorator1(component);        component = new ConcreteDecorator2(component);        component.operate();    }}

装饰模式的优点

  • 装饰类和被装饰类可以独立发展,而不会互相耦合。也就是说:Component类无须知道Decorator类,Decorator类是从外部扩展Component类的功能,二Decorator也不用知道具体的构件。
  • 装饰模式是继承关系的一个替代方案。装饰类Decorator不管装饰多少层,返回的对象还是Component。
  • 装饰模式可以动态第扩展实现类的功能。

装饰模式的缺点

  • 多层装饰是很复杂的。

装饰模式的使用场景

  • 需要扩展一个类的功能,或给一个类增加附加功能。
  • 需要动态第给一个对象增加功能,这些功能还能动态的删除。
  • 需要为一批的兄弟类进行改装或加装功能,当然是首先装饰模式。

装饰模式的简单应用的类图及源码

这里写图片描述

  • 抽象的学校成绩单(抽象构件类)

    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("尊敬的XX家长");        System.out.println("----------------------");        System.out.println("语文:63  数学:65  体育:98  自然:60");        System.out.println("----------------------");        System.out.println("            家长签字:");    }    // 家长签字    @Override    public void sign(String name) {        System.out.println("          " + name);    }}
  • 抽象装饰类

    public abstract class Decorator extends SchoolReport {    //首先我需要通知是哪个成绩单    private SchoolReport schoolReport;    //构造函数,传递成绩单    public Decorator(SchoolReport _schoolReport) {        this.schoolReport = _schoolReport;    }    //成绩单还是要被看的    @Override    public void report() {        this.schoolReport.report();    }    //成绩单看完还是要签名的    @Override    public void sign(String name) {        this.schoolReport.sign(name);    }}
  • 具体装饰者类1

    public class HighScoreDecorator extends Decorator {    //构造函数    public HighScoreDecorator(SchoolReport _schoolReport) {        super(_schoolReport);    }    //汇报最高成绩    private void reportHighScore() {        System.out.println("这次考试语文最高75,数学73,自然71");    }    @Override    public void report() {        this.reportHighScore();        super.report();    }}
  • 具体装饰者类2

    public class SortDecorator extends Decorator {    //构造函数    public SortDecorator(SchoolReport _schoolReport) {        super(_schoolReport);    }    //说明我的排名情况    private void reportSort() {        System.out.println("我这次考试38名");    }    //看完,签名    @Override    public void report() {        super.report();        this.reportSort();    }}
  • 场景类

    public class Client {    public static void main(String[] args) {        SchoolReport schoolReport = null;        schoolReport = new FouthGradeSchoolReport();        schoolReport = new HighScoreDecorator(schoolReport);        schoolReport = new SortDecorator(schoolReport);        schoolReport.report();        schoolReport.sign("world");    }}
1 0
原创粉丝点击