技术开发 频道

我的实用设计模式之Observer模式

 【IT168技术文档】

 写这篇文章主要想总结自己的工作经验,温故而知新。为什么叫做实用设计模式,所谓的实用模式就是说这些模式在本人的实际工作中使用过的,而且本人相对熟悉的,经验认为这些模式的使用能给系统带来有效改善。这些模式大部分来源于GoF,由于最近工作专注于移动的开发,因此会尽量使用移动开发的例子。

 由于一直做监控程序的开发,对Observer模式的感受比较深,现在从一个例子入手,假如需求是实现一套手机告警监控系统,当一个智能手机接收到告警信息的时候需要通过不同的手段来通知用户,通知手段包括在LCD显示告警的图片和播放告警的声音。

 从上图可以看到这个系统主要分三个类,WarningManager负责管理和产生告警,AudioManager负责播放声音,DisplayManager负责显示告警图片。WarningManager和AudioManager以及DisplayManager是composition的关系,所谓composition就是强耦合,WarningManager包含了AudioManager和DisplayManager的引用,AudioManager和DisplayManager为WarningManager的成员。

 public sealed class Warning

 {

 public int Level{set; get;}

 public int Type{set; get;}

 }

 public class AudioManager

 {

 public void HandleWarning(Warning warning)

 {

 Console.WriteLine("Play warning audio.");

 }

 }

 public class DisplayManager

 {

 public void HandleWarning(Warning warning)

 {

 Console.WriteLine("Show warning picture.");

 }

 }

 public class WarningManager

 {

 private AudioManager audioManager = new AudioManager();

 private DisplayManager displayManager = new DisplayManager();

 private void HandleWarning(Warning warning)

 {

 audioManager.HandleWarning(warning);

 displayManager.HandleWarning(warning);

 }

 }

 但是有一天客户想出一个新需求,告警不仅仅需要发声和显示,而且需要发短信。为了处理这个需求,实现一个新的类SMSManager来处理短信操作。但是我们发现问题出现了,WarningManager的功能对于这个新需求本来不需要任何的修改(因为告警的管理和生产过程没有任何改变),但是为了发送短信,不得不把SMSManager的引用作为新的properties。也就是说,每次这样类似需求的修改,WarningManager都要做出相应的修改,如下代码。

 public class SMSManager

 {

 public void HandleWarning(Warning warning)

 {

 Console.WriteLine("Send out SMS.");

 }

 }

 public class WarningManager

 {

 private AudioManager audioManager = new AudioManager();

 private DisplayManager displayManager = new DisplayManager();

 private SMSManager smsManager = new SMSManager();

 private void HandleWarning(Warning warning)

 {

 audioManager.HandleWarning(warning);

 displayManager.HandleWarning(warning);

 smsManager.HandleWarning(warning);

 }

 }

0
相关文章