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

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

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

...待续....

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

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插入.

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

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

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

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

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

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

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

    一个插排引发的设计思想 (一) 观察者模式 一个插排引发的设计思想 (二) 抽象类与接口 一个插排引发的设计思想 (三) 委托与事件 ...待续.... 前两篇文章循序渐进的介绍了观察者模式.抽象类和 ...

  2. 掌据这几个设计思想,从单片机小白立马升级为单片机工程师

    分层思想 分层的思想,并不是什么神秘的东西,事实上很多做项目的工程师本身自己也会在用.看了不少帖子都发现没有提及这个东西,然而分层结构确是很有用的东西,参透后会有一种恍然大悟的感觉.如果说我不懂LCD ...

  3. 【IoT】交互式智能多功能插排设计

    介绍 通过对红外遥感技术.GSM远程控制技术等研究,开发设计了交互式智能多功能插排,可以实现多通道分离远程与近程定时功能.设计的"近距离红外遥控系统",在规定的空间距离范围内,可以 ...

  4. 求一个任意实数c的算术平方根g的算法设计思想_算法复习第四篇——贪心法

    公元2020年5月5日,距离算法考试仅剩4天. 一.知识归纳 1.设计思想 只根据当前已有的信息就做出选择,而且一旦做出了选择,将来无论如何都不能更改 不从整体最优考虑,所做的选择只是在某种意义上的局 ...

  5. 微服务设计简单实践---从一个简单需求学习微服务思想

    从一个案例来看,如何在做架构设计时利用微服务的思想来帮我们解决问题. 背景介绍 公司对产品服务的管理目前还停留在物理机的那种理念,虽然阿里云.AWS.腾讯云.OpenStack等云平台用的不亦乐乎,但 ...

  6. 【小家java】一个例子让就能你彻底理解Java的Future模式,Future类的设计思想

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  7. 使用Unity3D的设计思想实现一个简单的C#赛车游戏场景

    最近看了看一个C#游戏开发的公开课,在该公开课中使用面向对象思想与Unity3D游戏开发思想结合的方式,对一个简单的赛车游戏场景进行了实现.原本在C#中很方便地就可以完成的一个小场景,使用Unity3 ...

  8. 插座问题:体育馆要举办一场程序设计竞赛的现场赛,需要接入电子设备,而体育馆内的墙上只有一个三孔插座可供使用。现在组委会需要购买一批插排,使得全部用电器都能通电,想让你帮忙算算至少需要购买多少插排?

    问题描述 体育馆内要举办一场程序设计竞赛的现场赛,需要接入服务器.路由器.打印机.电脑等电子设备(假定所有用电器的插头都是三头的).而体育馆内的墙上只有一个三孔插座可供使用.现在组委会需要购买一批插排 ...

  9. Android应用程序和其设计思想--转载----做记录

    转载一篇Android 的先关文章,无论什么时候看都觉得有收获 文章来源地址 http://www.open-open.com/lib/view/open1466070376316.html 以下是正 ...

最新文章

  1. Android美工坊:Selector选择器的使用
  2. windows10下pip安装速度慢的解决办法
  3. 如何使用python批量下载-使用 Python + Selenium 批量下载素材
  4. 软工Chapter Seven
  5. 转载:KOF97八神攻防战
  6. ul c语言,IMX6UL裸机实现C语言蜂鸣器实验
  7. php设计模式 命令行模式,[设计模式]PHP设计模式之命令行模式
  8. Lotus Domino服务器及其应用系统的高级管理(2)
  9. Linux之date命
  10. 收集整理的较为经典的shell脚本合计
  11. HTML-超链接标签,表格,列表
  12. lora发射和接收原理_LoRa 的扩频技术
  13. Matlab读nc文件
  14. 系统设计:关于高可用系统的一些技术方案
  15. vue HTML内使用触底加载
  16. @synthesize 和 @dynamic 分别表示什么
  17. 困牛放牧(Sleepy Cow Herding)
  18. 软件项目管理_作业1
  19. google使用方法及技巧
  20. socket常用参数解释

热门文章

  1. 中南继续教育学院计算机绘图,求答案~~机电一体化,计算机绘图
  2. python ftp模块_python中的FTP文件模块
  3. 视觉SLAM总结——视觉特征子综述
  4. 学习速率 learning rate
  5. 【星球知识卡片】人脸属性编辑都有哪些核心知识点,如何长期进行学习
  6. 【GAN优化】最早被用于评价GAN模型的定量指标Inception Score是什么
  7. 【完结】12篇GAN的优化文章大盘点,浓浓的数学味儿
  8. 【杂谈】您想要的docker环境来了!
  9. 【完结】优秀的深度学习从业者都有哪些优秀的习惯
  10. 全球及中国新能源汽车产业应用现状与运营前景规划报告2022版