日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个插排引发的设计思想 (一) 观察者模式

發(fā)布時間:2025/3/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个插排引发的设计思想 (一) 观察者模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

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

一個插排引發(fā)的設計思想 (二) 抽象類與接口

一個插排引發(fā)的設計思想 (三) 委托與事件

...待續(xù)....

?

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

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

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

?

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

需求: 實現一個插排( 就叫它Output吧 , 英文Socket容易引起歧義 ) 的功能 , 它有N組插孔, 支持多個電器的插頭(對應著叫Input吧)插入并供電.

如下圖

? ? ? ............

需求分析:

1. 插排中有一個集合(即多組插孔), 并提供插頭插入(Add)和拔出(Remove)的方法.?

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

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

?

一. 首先定義一個國標(GB)標準, 只有符合此標準的電器才能插入. abstract的"電器"類GBElectricalAppliance.?

它有個插頭的功能即 Input 方法,Input方法有兩個參數 left 和 right 象征插頭的兩個針腳.

1 public abstract class GBElectricalAppliance 2 { 3 public abstract void Input(int left, int right); 4 }

?

二. 寫個插排(Output)類

1 public class OutPut 2 { 3 public OutPut() 4 { 5 this.EACollection = new List<GBElectricalAppliance>(); 6 } 7 private List<GBElectricalAppliance> EACollection; 8 public void powered(int left,int right) 9 { 10 foreach (var item in EACollection) 11 { 12 item.Input(left,right); 13 } 14 } 15 public void AddInput(GBElectricalAppliance item) 16 { 17 EACollection.Add(item); 18 } 19 20 public void RemoveInput(GBElectricalAppliance item) 21 { 22 EACollection.Remove(item); 23 } 24 }

?

此類有個private 的集合 EACollection, 兩個Public的方法AddInput和RemoveInput 方法參數為GBElectricalAppliance, 即只支持符合標準的插頭插拔.

當插排Output供電(方法powered)時, 遍歷集和EACollection, 調用集和中的電器的Input方法為電器供電.

?

?

三. 分別定義一個電視TV和電水壺ElectricKettle繼承此類并實現插頭的功能即 Input 方法.

1 public class TV : GBElectricalAppliance 2 { 3 public override void Input(int left, int right) 4 { 5 Show(); 6 Sound(); 7 } 8 9 private void Show() 10 { 11 Console.WriteLine("I am showing"); 12 } 13 private void Sound() 14 { 15 Console.WriteLine("I am sounding"); 16 } 17 } 18 19 public class ElectricKettle : GBElectricalAppliance 20 { 21 public override void Input(int left, int right) 22 { 23 Heat(); 24 } 25 26 private void Heat() 27 { 28 Console.WriteLine("I am heating"); 29 } 30 }

?

Main方法測試一下:

輸出:

I am showing

I am sounding

I am heating

?

?四. 小結

到此為止, 功能基本實現了, 我們還可以定義充電寶、電燈等"電器"繼承GBElectricalAppliance插入.

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

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

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

?

以上寫法差不多是看到需求后按照第一感覺實現的, 仔細想想我們是不是可以用接口、委托什么的改造一下,

下一篇文章我們繼續(xù)討論.

?

總結

以上是生活随笔為你收集整理的一个插排引发的设计思想 (一) 观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。