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

 

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

一个插排引发的设计思想 (二) 抽象类与接口

一个插排引发的设计思想 (三) 委托与事件

...待续....

 

不知道聊到设计模式,  经常给人两种感觉:

1. 原来这个就是a设计模式呀, 我之前也经常这么干, 就是到现在才知道a设计模式指的就是这个.

2. 这个b设计模式, 虽然书上讲的晦涩难懂, 但我还是勉强理解了, 可是平时基本上用不着,  不知道啥时候改用, 甚至有时候感觉这是在"过度设计".

 

今天就以一个插排为例来展开学习一下.

需求: 实现一个插排( 就叫它output吧 , 英文socket容易引起歧义 ) 的功能 , 它有n组插孔, 支持多个电器的插头(对应着叫input吧)插入并供电.

如下图

   
 
............

需求分析:

1. 插排中有一个集合(即多组插孔), 并提供插头插入(add)和拔出(remove)的方法. 

2. 插入和拔出的插头(参数)需要满足一定的规则, 大家都知道不同国家的插座标准好多不一样的,比如电压和针脚的间距等, 这里就按中国标准吧, 咱也弄个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插入.

仔细回味一下,  这其实是用到了观察者模式, 

观察者(电器)将插头注册到被观察者(插排)的集和中, 当被插排供电后, 插排会通知所有注册到集和中的插头进行供电.

插排不关心插上的具体是什么电器, 只要它是符合国标的电器即可. 通过这样的设计尽量降低插座与电器之间的耦合度.

 

以上写法差不多是看到需求后按照第一感觉实现的, 仔细想想我们是不是可以用接口、委托什么的改造一下,

下一篇文章我们继续讨论.

 

本文链接:https://2i3i.com/8379934.html ,转载请注明来源地址。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇