這種設計模式能夠大大下降程序模塊之間的耦合度,便於更加靈活的擴展和維護。segmentfault
中介者模式經過統一接口來維護一對多關係,且通訊者之間不須要知道彼此之間的關係,只須要約定好API便可。設計模式
如下狀況下能夠考慮使用中介者模式:安全
一組定義良好的對象,如今要進行復雜的相互通訊。bash
想經過一箇中間類來封裝多個類中的行爲,而又不想生成太多的子類。函數
爲其餘對象提供一種代理以控制對這個對象的訪問。 代理模式使得代理對象控制具體對象的引用。代理幾乎能夠是任何對象:文件,資源,內存中的對象,或者是一些難以複製的東西。ui
主要解決:在直接訪問對象時帶來的問題,好比說:要訪問的對象在遠程的機器上。在面向對象系統中,有些對象因爲某些緣由(好比對象建立開銷很大,或者某些操做須要安全控制,或者須要進程外的訪問),直接訪問會給使用者或者系統結構帶來不少麻煩,咱們能夠在訪問此對象時加上一個對此對象的訪問層。spa
保證一個類只有一個實例,並提供一個訪問它的全局訪問點(調用一個類,任什麼時候候返回的都是同一個實例)。設計
實現方法:使用一個變量來標誌當前是否已經爲某個類建立過對象,若是建立了,則在下一次獲取該類的實例時,直接返回以前建立的對象,不然就建立一個對象。代理
假如咱們想在網頁面裏插入一些元素,而這些元素類型不固定,多是圖片、連接、文本,根據工廠模式的定義,在工廠模式下,工廠函數只需接受咱們要建立的元素的類型,其餘的工廠函數幫咱們處理。code
裝飾者(decorator)模式可以在不改變對象自身的基礎上,在程序運行期間給對像動態的添加職責(方法或屬性)。與繼承相比,裝飾者是一種更輕便靈活的作法。
ES7裝飾器
function isAnimal(target) {
target.isAnimal = true
return target
}
// 裝飾器
@isAnimal
class Cat {
// ...
}
console.log(Cat.isAnimal) // true
做用於類屬性的裝飾器:
function readonly(target, name, descriptor) {
discriptor.writable = false
return discriptor
}
class Cat {
@readonly
say() {
console.log("meow ~")
}
}
var kitty = new Cat()
kitty.say = function() {
console.log("woof !")
}
kitty.say() // meow ~
複製代碼
僅用於我的整理,參考: