天天看點

設計模式之-裝飾者模式

文章目錄

  • 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​​