《設計模式四》觀察、組合、享元模式

morpheus發表於2020-04-19

1.8 觀察者模式-Observer(重要)

定義觀察者介面,可以有多個觀察者實現該介面。觀察者經常和責任鏈一起使用,觀察者可以當做責任鏈的一環。

  • 一般事件都是使用的觀察者模式,比如鍵盤事件,滑鼠事件等
  • 事件源物件,觀察者

1.8.1 Spring的AOP

  • Spring的Aop就可以當成一個觀察者模式的實現,一直在觀察這個切面

1.8.2 鍵盤監聽器

  • 很多事件也是使用的觀察者模式,例如鍵盤監聽器,監聽鍵盤事件
  • 總結:Observer 或 Listenner 或 Hook 或 Callback這種實質上都是屬於觀察者模式

1.9 組合模式 - Composite

  • 常用作組織結構,組織樹,樹狀結構
  • 比如根目錄下有幾個一級子目錄,子目錄下又有子目錄,做的事情不同

1.10 享元模式-Flyweight

重複利用物件,常用在輸入工具,例如word中,比如你鍵盤敲擊一個字母A。那麼如果沒有享元會怎麼樣呢,每敲擊一次,就會有一個A物件產生。享元模式事先把A~Z都存下來,放到一個池子中。當做共享的後設資料

1.10.1 連線池,執行緒池:Pool

連線池,執行緒池,都是用的享元模式

1.10.2 Java中的String

Java中的字串,都放在字串常量池裡面

public static void main(String[] args) {
    String s1 = "abc";
    String s2 = "abc";
    String s3 = new String("abc");
    String s4 = new String("abc");
    
    // true
    System.out.println(s1 == s2);
    // false
    System.out.println(s1 == s3);
    // false
    System.out.println(s3 == s4);
    // true
    System.out.println(s3.intern == s1);
    // true
    System.out.println(s.intern == s4.intern);
}

解釋:
s1 == s2是因為字串常量池已經有"abc",用的是同一個
s3 == s4是因為new操作重新分配了記憶體,記憶體地址不同,所以false
s3.intern == s1是因為s3.intern表示的是s3對應的常量池引用,因為雖然s3開闢了記憶體,但是指向的常量也會從常量池裡面拿,不會新建立"abc""

1.10.3 結合組合模式的享元模式

享元的元物件,可以組合成另外的元物件,所以可以和組合結合起來

相關文章