乙個插排引發的設計思想 (一) 觀察者模式
乙個插排引發的設計思想 (二) 抽象類與介面
乙個插排引發的設計思想 (三) 委託與事件
...待續....
前兩篇文章循序漸進的介紹了觀察者模式、抽象類和介面, 並分析了抽象類和介面的不同.
結尾處有這樣的問題:
無論是抽象類還是介面, 都是將裝置本身放入了插排的集合中, 那麼我們是否可以將此處的引數改為裝置的input方法呢?
那麼我們就用到了委託delegate.
1public
delegate
void inputdelegate(int left, int right);
看到接下來的**, 老鳥別笑, 請允許我"循序漸進"的引導著思路重構.
我們用委託inputdelegate定義了插頭的標準. 那麼原來的**改變一下
1public
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依然沒問題.
1public
class
electrickettle27
8private
void
heat()
912 }
通過上面的方法, 我們把插入插排的引數由整個裝置改成了裝置的插頭.
功能是實現了, 但delegate用起來沒必要那麼麻煩, 我們繼續改
我們改造一下output類
1public
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, 把插排都弄沒了, 讓別的插頭怎麼辦.
所以我們還希望像原來那樣只提供增減的方法, 不允許賦值, 這裡我們就用到了事件.
1public
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如下 根據官方教程,可以找到事件執行函式,在此處可以看到列印語句。接下來新增繼電器控制函式 所...