日韩性视频-久久久蜜桃-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ù)討論.

?

總結

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

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

主站蜘蛛池模板: 懂色aⅴ一区二区三区免费 国产精品99在线观看 | 91精品视频网 | 日本不卡在线 | 瑟瑟综合 | 女人夜夜春| av大片网站 | 国产91丝袜在线观看 | 国产又粗又猛视频 | 无码免费一区二区三区免费播放 | 色老汉av一区二区三区 | 久久综合久久鬼 | 九色porn蝌蚪 | 永久久久久久久 | 成人免费毛片足控 | 成人在线观看你懂的 | 一本久道在线 | av一区二区三区在线观看 | www.九九九 | 久久综合色综合 | 日本成人免费网站 | 欧美激情亚洲综合 | 国产传媒视频 | 91亚洲国产 | 国产精品高清在线 | 国产精品国产一区二区 | 中文一区在线观看 | 午夜小视频在线播放 | 日韩人妻精品一区二区三区 | 999久久久国产精品 韩国精品一区二区 | 四虎影成人精品a片 | 精品综合在线 | 俺去久久 | 2020狠狠干| 欧美一区二区在线视频 | 亚洲天堂男人天堂 | 麻豆影音 | 一区二区三区在线播放视频 | 久操久操久操 | 国产一二区在线 | 国产免费观看av | 二区免费视频 | 精品视频在线观看一区 | 日韩网站在线 | 男女黄色片 | 国产精品久久久久久久久晋中 | 四虎成人影视 | www.九九九 | 国产aⅴ无码片毛片一级一区2 | 久草在现 | 国产日韩在线播放 | xxxx 国产| 亚洲精品无码成人 | 综合网激情| 精品在线视频一区二区 | 福利所第一导航 | 爽妇网国产精品 | 日本一二三不卡 | 在线观看免费高清在线观看 | 国产9区 | 国产精品毛片一区二区在线看舒淇 | 一级成人毛片 | 黄色91在线观看 | 中国黄色大片 | 看免费黄色大片 | 亚洲精品乱码久久久久久蜜桃麻豆 | 草草草在线观看 | 91国产精品| 麻豆回家视频区一区二 | 国产精品suv一区二区88 | 99热这里 | 日韩无砖 | 狠狠躁日日躁夜夜躁 | 久久看片网 | 僵尸叔叔在线观看国语高清免费观看 | 欧美日本道 | 青青青在线免费 | 色图自拍 | 女性裸体下面张开 | 免费的黄色的视频 | 抱着老师的嫩臀猛然挺进视频 | 国产网站免费在线观看 | 欧美一区二区视频免费观看 | 一女双乳被两男吸视频 | 欧美一级高清片 | 天天插天天干天天操 | 97精品人妻一区二区 | 亚洲一区二区三区四区av | 精品国产精品网麻豆系列 | 久久久无码人妻精品一区 | 亚洲精品美女 | 天天都色 | 亚洲春色在线观看 | 密臀av一区二区 | 国产一区99 | 亚洲 欧美 日韩 综合 | 欧美激情在线播放 | 一区二区三区精品免费视频 | 国产精品视频一区二区三区不卡 | 理论片午午伦夜理片影院99 |