乙個插排引發的設計思想 一 觀察者模式

2021-09-07 16:41:03 字數 1921 閱讀 4658

乙個插排引發的設計思想 (一) 觀察者模式

乙個插排引發的設計思想 (二) 抽象類與介面

乙個插排引發的設計思想 (三) 委託與事件

...待續....

不知道聊到設計模式,  經常給人兩種感覺:

1. 原來這個就是a設計模式呀, 我之前也經常這麼幹, 就是到現在才知道a設計模式指的就是這個.

2. 這個b設計模式, 雖然書上講的晦澀難懂, 但我還是勉強理解了, 可是平時基本上用不著,  不知道啥時候改用, 甚至有時候感覺這是在"過度設計".

今天就以乙個插排為例來展開學習一下.

需求: 實現乙個插排( 就叫它output吧 , 英文socket容易引起歧義 ) 的功能 , 它有n組插孔, 支援多個電器的插頭(對應著叫input吧)插入並供電.

如下圖

需求分析:

1. 插排中有乙個集合(即多組插孔), 並提供插頭插入(add)和拔出(remove)的方法. 

2. 插入和拔出的插頭(引數)需要滿足一定的規則, 大家都知道不同國家的插座標準好多不一樣的,比如電壓和針腳的間距等, 這裡就按中國標準吧, 咱也弄個gb.

好的, 根據第一感覺開始coding....

它有個插頭的功能即 input 方法,input方法有兩個引數 left 和 right 象徵插頭的兩個針腳.

1

public

abstract

class

2

二. 寫個插排(output)類

1

public

class

output27

8public

void powered(int left,int

right)914

}15public

void

1619

20public

void

2124 }

當插排output供電(方法powered)時, 遍歷集和eacollection, 呼叫集和中的電器的input方法為電器供電.

三. 分別定義乙個電視tv和電水壺electrickettle繼承此類並實現插頭的功能即 input 方法.

1

public

class28

9private

void

show()

1013

private

void

sound()

1417}18

19public

class

2025

26private

void

heat()

2730 }

main方法測試一下:

輸出:i am showing

i am sounding

i am heating

四. 小結

仔細回味一下,  這其實是用到了觀察者模式, 

觀察者(電器)將插頭註冊到被觀察者(插排)的集和中, 當被插排供電後, 插排會通知所有註冊到集和中的插頭進行供電.

插排不關心插上的具體是什麼電器, 只要它是符合國標的電器即可. 通過這樣的設計盡量降低插座與電器之間的耦合度.

以上寫法差不多是看到需求後按照第一感覺實現的, 仔細想想我們是不是可以用介面、委託什麼的改造一下,

乙個插排引發的設計思想 三 委託與事件

乙個插排引發的設計思想 一 觀察者模式 乙個插排引發的設計思想 二 抽象類與介面 乙個插排引發的設計思想 三 委託與事件 待續.前兩篇文章循序漸進的介紹了觀察者模式 抽象類和介面,並分析了抽象類和介面的不同.結尾處有這樣的問題 無論是抽象類還是介面,都是將裝置本身放入了插排的集合中,那麼我們是否可以...

乙個插排引發的設計思想 二 抽象類與介面

乙個插排引發的設計思想 一 觀察者模式 乙個插排引發的設計思想 二 抽象類與介面 乙個插排引發的設計思想 三 委託與事件 待續.其中插頭的規範部分值得思考,上文採用了abstract class的方式,既然是定義規範,為什麼不用介面方式呢?一.下面把上面的例子改造一下,將原來的abstract cl...

乙個簡單的觀察者模式

物件之間存在依賴關係,當主要物件狀態發生改變,所有依賴它的物件都得到通知並作出相應的反應。class boss def init self self.observers self.state def add self,observe 新增觀察者 def notice self 逐個傳送通知 for ...