溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用javascript中的裝飾模式

發(fā)布時間:2020-08-04 10:08:31 來源:億速云 閱讀:91 作者:小豬 欄目:web開發(fā)

這篇文章主要講解了如何使用javascript中的裝飾模式,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

介紹:裝飾模式可以在不改變一個對象本身功能的基礎上給對象增加額外的新行為。在現(xiàn)實生活中,這種情況也到處存在,例如一張照片,可以不改變照片本身,通過增加一個相框,使其具有防潮的功能。裝飾模式是一種用于替代繼承的技術,它使用對象之間的關聯(lián)關系來取代繼承關系。

定義:動態(tài)的給一個對象增加一些額外的職責,就增加對象功能來說,裝飾模式比生成子類實現(xiàn)更為靈活。裝飾模式是一種對象結構模型。

場景:我們現(xiàn)有一個Circle類用來畫一個圓,新的需求要求畫一個紅色的圓,又一個新的需求要求我們畫一個半徑20的圓,又一個新的需求要求我們畫一個紅色的,半徑20的圓。
如何設計才能讓我們的代碼來兼容這樣的需求呢?我們首先給Circle類包裝一個顏色的相框,這個相框用來改變圓的顏色。再給Circle類包裝一個大小的相框,這個相框用來改變圓的大小。通過不同的相框組合來達到想要的效果。

示例:

var Circle = function(){
  this.draw = function(){
    console.log('畫圓');
  };
}
 
var ColorDecorator = function(circle){
  this.circle = circle;
  this.draw = function(){
    this.circle.draw();
    setColor();
    return this.circle;
  }
  function setColor(){
    console.log('紅色');
  }
}
 
var RadiusDecorator = function(circle){
  this.circle = circle;
  this.draw = function(){
    this.circle.draw();
    setRadius();
  }
  function setRadius(){
    console.log('半徑:20px')
  }
}
 
var circle = new Circle();
 
var redCricle = new ColorDecorator(circle);
 
var radiusCricle = new RadiusDecorator(circle);
 
var radiusRedCircle = new RadiusDecorator(new ColorDecorator(circle));
 
//輸出:
circle.draw();  //畫圓
 
redCricle.draw(); //畫圓 紅色
 
radiusCricle.draw(); //畫圓 半徑:20px
 
radiusRedCircle.draw(); //畫圓 紅色 半徑:20px

以上就是裝飾模式的示例,比較好懂,在不改變Circle類基礎上進行擴展,通過包裝一層來實現(xiàn)新特性。降低了系統(tǒng)的耦合度。與繼承結構相比,裝飾模式大大減少了子類的個數(shù),讓系統(tǒng)擴展起來更加方便,而且更容易維護。RadiusDecorator,ColorDecorator稱為裝飾類,他們的引入將大大簡化系統(tǒng)的設計,他也是裝飾模式的核心。

裝飾模式總結:

優(yōu)點:
* 便于擴展一個對象的功能,裝飾模式比繼承更加具有靈活性,不會導致類的個數(shù)急劇增加。
* 可以通過一種動態(tài)的方式來擴展一個對象的功能。
* 可以對一個對象進行多次裝飾,通過不同的裝飾類組合,可以創(chuàng)造很多不同行為的組合,得到功能更強大的對象

缺點:
* 使用裝飾模式過程中會產生很多小對象,一定程度影響程序性能。
* 裝飾模式特別靈活,同時也意味著更加容易出錯,排除復雜度也不低。

適用場景:
* 不影響對象的基礎下進行擴展,添加職責

看完上述內容,是不是對如何使用javascript中的裝飾模式有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI