設計模式之裝飾者模式


前言

這是本人的設計模式學習筆記,把本身學習過程當中的一些總結和認識記錄下來,與諸君共勉。設計模式

基本概念

所謂裝飾者,就是爲以前的對象添加行爲的存在,容許行爲能夠被修改而無需修改現有代碼。要想了解裝飾者,首先要介紹幾個重要的概念:函數

  • 組件:被裝飾的對象
  • 裝飾者:自己既是對象,以組件爲參,返回裝飾後的對象
  • 接口:功能的組合,在oo語言中是要求類必須實現的方法

咱們首先要了解如下特性:學習

  • 裝飾者和組件有共同的超類
  • 組件能夠被任意屢次裝飾
  • 裝飾前和裝飾後應該暴露出一樣的接口
  • 裝飾 使用繼承,但擴展的方式和繼承不一樣
  • 行爲能夠添加在方法前和方法後

咱們用下面這幅圖來揭示裝飾者的結構:
裝飾者模式示意圖this

下面給出一段代碼的例子:spa

js//共有超類
var org=function(){this.cost=0;};
org.prototype.getCost=function(){};

//組件
var component=function(num){this.cost=num;};
component.prototype=new org();
component.prototype.getCost=function(){return this.cost;};

//裝飾者
var decorator=function(component){
    this.base=component;
};
decorator.prototype=new org();
decorator.prototype.getCost=function(){
    return this.base.getCost()+1.0;
};

//裝飾過程

var exp=new component(1.0);
var exp2=new decorator(exp);
exp2.getCost();//2.0

這裏用js其實不大恰當,並不能很好地解釋裝飾者模式,之因此用js來講明,是想說裝飾者模式並不是僅僅限於oo語言的場合,對於動態語言,它依然大有用處。prototype

應用場合

裝飾者適用各類行爲能夠大量組合起來,這種時候不使用裝飾者的話就不得不爲全部的組合狀況都定義一個類,這無疑是一個災難。使用裝飾者的話,就只用預先定義組合的元素,對於不一樣的組合方式,動態地實現要求的接口,顯然更加優越。設計

舉一個例子,賣電腦器材,以每一次交易爲一個對象,爲了計算出交易金額和記錄交易配件,若是使用繼承的話,須要列出全部器材的組合狀況,而使用裝飾者模式的話,就是把每一種器件都作成一個裝飾者。固然在這個例子裏面好像這也不是什麼好的解決方式,你能夠用一個列表來記錄所賣的全部器件,而後寫個函數遍歷列表計算。寫出這個例子也是爲了告訴咱們儘管不少地方可使用設計模式,但不要作設計模式驅動的開發,而是作設計原則驅動的開發。code

設計原則

  • 對擴展開發,對修改關閉
  • 多用組合,少用繼承
相關文章
相關標籤/搜索