天天看点

设计模式之-装饰者模式

文章目录

  • 2.demo类生成的uml
  • 3.源码:
  • FatherReader 类
  • SchoolReport 类。
  • Decorator 类
  • HighScoreDecorator 类
  • SortDecorator 类
  • 4.(标准类图)
  • 总结:
  • demo下载地址 http://pan.baidu.com/s/1jIpZcWm

重点内容

1.什么是装饰模式

2.装饰模式使用场景

3.使用装饰模式需要注意那些点

4.装饰者设计模式优点缺点。

Eg:解释一下面向对象:

面向对象思想的核心之一,就是模拟真实世界,把真实世界中的事物抽象成类,整个程序靠各个类的实例互相通信、互相协作完成系统功能,这非常符合真实世界的运行状况,也是面向对象思想的精髓。

2.demo类生成的uml

设计模式之-装饰者模式

3.源码:

FatherReader 类

package model;

public class FatherReader {
  /**
   * @param args
   */
  public static void main(String[] args) {

    SchoolReport sReport = new FourGradeReport(); //原始成绩单子

    sReport = new HighScoreDecorator(sReport); //高分进行装饰

    sReport = new SortDecorator(sReport);//排序进行装饰

    sReport.report();//生成报告单子

    sReport.sign();

  }

}      

1.也用到了多态。首先初始化原始成绩单对象

2.对原始成绩单进行相应功能的修饰(高分,排序)

3.进行输出

设计模式之-装饰者模式

SchoolReport 类。

package model;

public abstract class SchoolReport {

  public abstract void report();// 成绩单

  public abstract void sign();// 签名
}      

1.这是最核心、最原始、最基本的接口或抽象类。

2.Decorator会对该类进行包装,便于子类进行操作。

Decorator 类

package model;

/**
 * 对 父类的一个包装
 * 
 * @author weichyang
 * 
 */
public class Decorator extends SchoolReport {

  SchoolReport srReport;

  public Decorator(SchoolReport srReport) {
    this.srReport = srReport;
  }

  @Override
  public void report() {
    srReport.report();
    System.out.println("执行Report()");
  }

  @Override
  public void sign() {
    srReport.sign();
  }

}      

1.看名字就知道,这个是装饰类

2.对需要装饰的原始类进行封装

HighScoreDecorator 类

package model;

public class HighScoreDecorator extends Decorator {

  public HighScoreDecorator(SchoolReport srReport) {
    super(srReport);
  }

  private void reportHighScore() {
    System.out.println("这次考试语文最高是75,数学是78,自然是80");
  }

  @Override
  public void report() {
    System.out.println("++++++++++++++++++++++++");
    this.reportHighScore();
    super.report();
    System.out.println("+++++++++ end +++++++++");
  }

}      

1.对某个功能进行包装或者增强

SortDecorator 类

package model;

public class SortDecorator extends Decorator {

  public SortDecorator(SchoolReport srReport) {
    super(srReport);
  }

  private void sort() {
    System.out.println("在本班的排名是第20名");
  }

  @Override
  public void report() {
    System.out.println("---------------------");
    this.sort();
    super.report();
    System.out.println("-------- end --------");
  }

}      

4.(标准类图)

设计模式之-装饰者模式

看类图,Component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象,比

如上面的成绩单,记住在装饰模式中,必然有一个被提取出来最核心、最原始、最基本的接口或抽象类,

就是 Component。

ConcreteComponent 这个事最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是这个东东。

Decorator 一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方法呀,

在它的属性里必然有一个 private 变量指向 Component。

ConcreteDecoratorA 和 ConcreteDecoratorB 是两个具体的装饰类,你要把你最核心的、最原始的、最

基本的东西装饰城啥东西,上面的例子就是把一个比较平庸的成绩单装饰成家长认可的成绩单。

装饰模式是对继承的有力补充,你要知道继承可不是万能的,继承可以解决实际的问题,但是在项目

中你要考虑诸如易维护、易扩展、易复用等,而且在一些情况下(比如上面那个成绩单例子)你要是用继

承就会增加很多了类,而且灵活性非常的差,那当然维护也不容易了,也就是说装饰模式可以替代继承,

解决我们类膨胀的问题,你要知道继承是静态的给类增加功能,而装饰模式则是动态的给增加功能,你看

上面的那个例子,我不想要 SortDecorator 这层的封装也很简单呀,直接在 Father 中去掉就可以了,如果

你用继承就必须修改程序。

装饰模式还有一个非常好的优点,扩展性非常好,在一个项目中,你会有非常多因素考虑不到,特别

是业务的变更,时不时的冒出一个需求,特别是提出一个令项目大量延迟的需求时候,那种心情是…,真

想骂娘!装饰模式可以给我们很好的帮助,通过装饰模式重新封装一个类,而不是通过继承来完成。这就是装饰模式的简单使用。

总结:

装饰者模式可以动态给对象增加方法,灵活性,可维护性要强于类继承方式,装饰和代理模式都可以在真是对象的方法前增加一些对其他函数的调用。但是装饰着强调的是运行时动态给对象增加方法。代理强调的是对被代理类的隐藏。

demo下载地址 ​​http://pan.baidu.com/s/1jIpZcWm​​