裝飾模式、原型模式、模板模式、享元模式
相似點
這幾個從名字上都看出有複用的意思,裝飾模式:通過對A裝飾獲得B,B擁有A的功能;
原型模型:通過clone A獲得B,B也有A的功能;
模板模式:B通過繼承A,B擁有A的功能;
享元模式:其實享元模式不應該和其他三個在一起比較,因為其他三個傾向於複用,而享元傾向於共用;享元將和單例進行比較;
下面我們將分析裝飾模式、原型模式、模板模式進行比較。
UML
裝飾模式 | 模板模式 | 原型模式 |
裝飾模式
當需要從一個原始類A衍生出類B時,類B不但有類A的功能,而且可能還會增加其他功能,在類A設計的時候可能根本沒有想到會有類B。這個在UI中應該應用得最多,我們可以在原生Button的基礎上重新設計出自己的Button,新設計的Button不但有原生Button的所有功能,而且可能我們還會設計的更漂亮。在這裡類A和類B都可以生成物件,B is a A,但是類B在A基礎上擴充套件了很多功能。
模板模式
模板模式和裝飾模式很相似,也是類B繼承於類A,只是類B不會對類A定義的功能進行擴充套件,而且一般情況下類A是抽象類,不能定義物件。
模板模式是非常常用的,如果你做了一段時間的面向物件程式設計,並且寫過類繼承的程式碼,那麼你百分之八十寫過模板的設計模式,只是寫的時候不知道這個簡單的寫法竟然是一個設計模式。有沒有曾經寫過類似這樣的繼承結構,定義了一個基類,它有一些virtual函式又有一些nonevirtual函式,繼承類肯定要對virtual函式進行重寫,當然對nonevirtual函式不能重寫,這就是模板模式。
模板模式是將一些固定的流程或者業務在基類中定義好(以nonevirtual存在,因為繼承類也要使用這些方法),不固定的在繼承類中去實現(當然這些是virtual方法),這樣就達到了最大限度的重用程式碼,但是還有更重要的作用:
1. 基類定義好了業務流程,這個業務流程就是nonevirtual函式進行支撐的,因為nonevirtual函式的業務邏輯無法修改,繼承類只需要根據自己的獨特性質實現virtual函
數;
原型模式
原型模式雖然也是複用,但是與裝飾和模板模式通過繼承達到複用不一樣,原型模式是複用資料。裝飾模式和模板模式是程式碼的複用,而原型模式執行是建立的物件的資料複用。所以一般原型模式的類中一般都會有clone函式。
總結
模板模式:最常用,類A定義了介面,類B繼承A,然後實現其中的介面;裝飾模式:用於繼承並擴充套件,類A是已經設計好的某個類,類B通過繼承A擁有了A的所有性質,然後又在基礎上進行了功能擴充套件;
原型模式:它是執行階段對物件資料的複用;
享元模式:它不是複用而是共用,它和單例是同類型的模式;