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

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

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


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


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


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


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


如下图

image.pngimage.pngimage.png

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


需求分析:


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 方法.

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方法测试一下:

image.png



输出:


I am showing


I am sounding


I am heating


四. 小结


到此为止, 功能基本实现了, 我们还可以定义充电宝、电灯等"电器"继承GBElectricalAppliance插入.


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


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


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


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


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



目录
相关文章
|
1月前
|
设计模式 网络协议 Java
13.观察者模式设计思想
本文详细介绍了观察者模式的设计思想,包括其定义、实现方式、优缺点及应用场景。通过微信公众号的例子,阐述了如何使用观察者模式实现对象间的依赖关系,确保一个对象状态改变时能自动通知其他对象。文章还提供了观察者模式的结构图和时序图,帮助读者更好地理解和应用这一设计模式。
41 2
13.观察者模式设计思想
|
设计模式 消息中间件 存储
浅谈设计模式 - 观察者模式(四)
观察者模式又叫做 发布订阅模式,这个设计模式无论在工作还是生活的应用都是非常常见的,但是在我们的代码里面应用场景并不是很多,一般这种设计模式更多的是由 消息中间件进行替代,但是在swing等GUI框架里面可以看到大量的实际使用案例。
64 0
|
设计模式 Java
【设计模式系列】——观察者模式攻坚战
【设计模式系列】——观察者模式攻坚战
243 1
【设计模式系列】——观察者模式攻坚战
|
设计模式
设计模式之观察者模式
设计模式之观察者模式
设计模式之观察者模式
|
设计模式
设计模式轻松学【八】观察者模式
此设计模式最重要的作用就是解耦!将观察者与被观察者解耦,使得他们之间的依赖性更小。
104 0
设计模式轻松学【八】观察者模式
|
设计模式 资源调度 JavaScript
设计模式之观察者模式(5)
设计模式之观察者模式(5)
100 0
|
设计模式
设计模式-15-观察者模式
观察者模式(Observer Pattern)定义了一种对象间一对多的依赖关系,一个主题目标对象能被多个观察者对象同时监听,使得每当主题目标对象状态变化时,所有依赖它的对象都会得到通知并被自动更新,属于行为型设计模式。
92 0
|
设计模式 前端开发 程序员
【设计模式】观察者模式
【设计模式】观察者模式
158 0
【设计模式】观察者模式
|
Java
【设计模式系列】--观察者模式
在前面的博文中,小编介绍设计模式中的撩妹模式,不知道小伙伴们有没有从中get到技巧呢?今天这篇博文,咱们继续来学习设计模式的相关知识,今天小编向大家介绍的模式是观察者模式,还请小伙伴多多指教,小编会从什么是原型观察者模式、观察者模式的结构图、观察者模式的demo以及观察者模式的特点和应用场景等方面一一进行介绍,希望对有需要的小伙伴有帮助。
2083 0
|
设计模式 消息中间件 前端开发