《大話設計模式》讀書筆記(四)

2022-05-04 12:42:06 字數 3509 閱讀 6224

本文上接《大話設計模式》讀書筆記(三),本次主要介紹三種設計模式,外觀模式,建造者模式和觀察者模式。

解決的問題

外觀模式,正像它的名字。對於一些實現十分複雜,但使用者又沒必要知道這些複雜細節的時候,外觀模式可以提供乙個統一的簡單介面。外觀模式主要用於將層與層之間分離,提供簡單介面等等功能。

類圖結構

在圖中,facade是外觀類,知道哪些子系統負責處理請求,將客戶的請求**給適當的字系統物件。下面四個子類是子系統類的集合,實現子系統的功能,處理facade物件指派的任務。子類中沒有facade的任何資訊。

四個子系統的**:

public class subsystemone

}public class subsystemtwo

}public class subsystemthree

}public class subsystemfour

}

外觀類:

public class facade

public void methoda()

public void methodb()

}

好處與壞處

優點在之前的介紹中都寫過了,外觀模式可以簡化系統的呼叫,同時符合迪公尺特法則,降低了應用層和子系統之間的耦合度。也正因如此,外觀模式的缺點也就體現在不符合開閉原則。在我們拓展子系統的時候,必然要去修改子系統的**,這顯然違背了開閉原則。

解決的問題

建造者模式,將乙個複雜物件的構建和它的表示分離,使得同樣的構建過程可以建立不同的表示。多用於在將乙個複雜物件的構建與表示分離的情況下。在這種模式下,使用者只需指定建造的型別即可得到乙個物件,而無需知道具體的構建細節。

類圖結構

如圖,builder代表乙個建造者類,是乙個為建立乙個product物件的各個部件指定的抽象介面。concretebuilder是具體的建造者,實現了builder介面,構造和裝配各個部件。director類為指揮者類,是構建乙個使用builder介面的物件。product自然是具體的產品類了,不用多說了。

product類:

public class product

public void show()}}

builder類

public abstract class builder
concretebuilder類

public class concretebuilder extends builder

@override

public void buildpartb()

@override

public product getresult()

}

director類:

public class director

}

好處與壞處

好處為,使用建造者模式可以使得客戶端不必知道產品內部組成的細節,具體的建造者類之間是互相獨立的,這有助於系統的擴充套件。但由於建造者模式建立的產品大多都具有類似的特徵,因此建造者模式的使用範圍很窄。如果產品的內部變化複雜,會需要很多的具體建造者類來實現,會讓系統變得十分複雜。

解決的問題

觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某乙個主題物件。讓這個主題物件在狀態發生變化的時候會自動通知所有觀察者物件,使得他們可以自己更新自己。

類圖結構

subject類,它把所有的觀察者物件的引用儲存在乙個聚集裡,每個主題可以有任意數量的觀察者,抽象主題提供乙個可以增加和刪除觀察者物件的介面。observer類,抽象觀察者,為所有的具體觀察者定義乙個介面,在得到主題的通知時更新自己。concreteobserver類,具體觀察者,實現了抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題的狀態相一致。concretesubject類,具體主題,將有關狀態存入具體觀察者物件,在具體主題的內部狀態改變時,給所有登記的觀察者發出通知。

subject類:

public abstract class subject

public void detach(observer observer)

public void notify()}}

observer類:

public abstract class observer
concretesubject類:

public class concretesubject extends subject

public void setsubjectstate(string subjectstate)

}

concreteobserver類:

public class concreteobserver extends observer

@override

public void update()

public concretesubject getsubject()

public void setsubject(concretesubject subject)

}

好處與壞處

觀察者模式的效果有以下的優點:

第一、觀察者模式在被觀察者和觀察者之間建立乙個抽象的耦合。被觀察者角色所知道的只是乙個具體觀察者列表,每乙個具體觀察者都符合乙個抽象觀察者的介面。被觀察者並不認識任何乙個具體觀察者,它只知道它們都有乙個共同的介面。

第二、觀察者模式支援廣播通訊。被觀察者會向所有的登記過的觀察者發出通知,

觀察者模式有下面的缺點:

第一、如果乙個被觀察者物件有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

第二、如果在被觀察者之間有迴圈依賴的話,被觀察者會觸發它們之間進行迴圈呼叫,導致系統崩潰。在使用觀察者模式是要特別注意這一點。

第三、如果對觀察者的通知是通過另外的執行緒進行非同步投遞的話,系統必須保證投遞是以自恰的方式進行的。

第四、雖然觀察者模式可以隨時使觀察者知道所觀察的物件發生了變化,但是觀察者模式沒有相應的機制使觀察者知道所觀察的物件是怎麼發生變化的。

總的來說,這次學習了三個設計模式。

讀書筆記 大話設計模式

大話設計模式 的確寫的很不錯。把晦澀解懂的設計模式,講的通俗易懂。邊讀邊用evernote做筆記,把印象深刻的整理了一下。先補習一下uml的圖示法 繼承,介面,組合,依賴,關聯 策略模式 strategy 定義一系列演算法,所有演算法完成的都是相同的工作,只是實現不同。減少演算法與使用類之間的藕合。...

大話設計模式讀書筆記一

1矩形框代表乙個類。如果類是抽象的,那麼要用斜體表示。第二層是字段和屬性。第三次是類的方法和行為。對應的屬性表示為 notation meaning public private protected 乙個例子就是 如果定義乙個介面。要在名稱上面加 介面也用棒棒糖語法表示 下面將類與類之間的關係。知道...

讀書筆記 大話設計模式(上)

最近翻了大話設計模式,裡面的 很多,很值得細細品味,值得借鑑,可惜時間不太夠,就草草記錄了下一些重要的點,還有半本的下個月再寫。工廠模式 策略模式 單一職責。拍照就是拍照,單獨出來比較好。開放 封閉原則。對程式的改動是通過增加新 進行的,而不是更改現有的 一國兩制,考研找工作兩不誤。依賴倒轉原則。提...