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

2022-01-11 23:08:37 字數 2301 閱讀 9328

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

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

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

...待續....

前兩篇文章循序漸進的介紹了觀察者模式、抽象類和介面, 並分析了抽象類和介面的不同.

結尾處有這樣的問題:

無論是抽象類還是介面, 都是將裝置本身放入了插排的集合中, 那麼我們是否可以將此處的引數改為裝置的input方法呢?

那麼我們就用到了委託delegate.

1

public

delegate

void inputdelegate(int left, int right);

看到接下來的**, 老鳥別笑, 請允許我"循序漸進"的引導著思路重構.

我們用委託inputdelegate定義了插頭的標準. 那麼原來的**改變一下

1

public

delegate

void inputdelegate(int left, int

right);

2public

class

output38

private listeacollection;

9public

void powered(int left, int

right)

1015}16

public

void

addinput(inputdelegate item)

1720

21public

void

removeinput(inputdelegate item)

2225}26

27class

program

2839 }

原來的tv和electrickettle無需任何繼承任何抽象類和介面, 只要有和定義的delegate一樣的方法簽名的方法即可.

甚至名字都可以不一樣, 例如electrickettle的input方法我隨便改了一下改成了inputaaaa依然沒問題.

1

public

class

electrickettle27

8private

void

heat()

912 }

通過上面的方法, 我們把插入插排的引數由整個裝置改成了裝置的插頭. 

功能是實現了, 但delegate用起來沒必要那麼麻煩, 我們繼續改

我們改造一下output類

1

public

delegate

void inputdelegate(int left, int

right);

2public

class

output39

}1011class

program

1223 }

簡潔多了, 根據delegate的特性, 插排集本身也被inputdelegate代替了.

在呼叫的時候, 我們只需將input方法 +=到該inputdelegate即可.

上面的例子貌似已經很好了, 但既然是插排, 也就是可能會有好多插頭來插拔, 而插頭之間互不干涉, 呼叫的位置可能存在於系統的任何位置 .

但上面的**讓我們想到乙個問題,

我們把"集和"暴露出來了, 之前的 private listeacollection是私有的, 只可以通過add和 remove兩個方法操作.

現在我們把它public了,  哪個搗蛋的寫了一句op.inputdelegate = null,  把插排都弄沒了, 讓別的插頭怎麼辦.

所以我們還希望像原來那樣只提供增減的方法, 不允許賦值, 這裡我們就用到了事件.

1

public

delegate

void inputdelegate(int left, int

right);23

public

class

output410

}1112class

program

1325 }

output中的 inputdelegate 改為了 inputevent, inputevent不再允許通過=來賦值了.

main方法中注釋的一行  = null; 測試了一下 , 已經編譯不通過了.

本文通過委託, 將方法作為引數註冊到了插排中.  因為安全問題, 又將委託改為了事件.

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

乙個插排引發的設計思想 一 觀察者模式 乙個插排引發的設計思想 二 抽象類與介面 乙個插排引發的設計思想 三 委託與事件 待續.不知道聊到設計模式,經常給人兩種感覺 1.原來這個就是a設計模式呀,我之前也經常這麼幹,就是到現在才知道a設計模式指的就是這個.2.這個b設計模式,雖然書上講的晦澀難懂,但...

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

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

做乙個「有思想的插排」 APP控制裝置

對程式不是很了解的,可以去看一下機智雲官方文件中心的gokit soc程式詳解 官方soc韌體中,使用txd1列印輸出log日誌。我是用的是nodemcu,所以按照引腳圖,使用usb轉串列埠工具,列印log如下 根據官方教程,可以找到事件執行函式,在此處可以看到列印語句。接下來新增繼電器控制函式 所...