22_C#设计模式-观察者模式

Design Patterns

观察者模式

刘 伟 (Sunny)\rweiliu_china@126.com

大纲

\r

观察者模式概述\r观察者模式的结构与实现\r观察者模式的应用实例\r观察者模式与.NET中的委托事件模型\r观察者模式与MVC\r观察者模式的优缺点与适用环境

观察者模式概述

交通信号灯与汽车示意图

观察者模式概述

分析\r交通信号灯 ? ? 观察目标\r汽车(汽车驾驶员) ? ?观察者\r

一\r对\r多

观察者模式概述

分析\r软件系统:一个对象的状态或行为的变化将导致其他对象的状态或行为也发生改变,它们之间将产生联动\r观察者模式:\r定义了对象之间一种一对多的依赖关系,让一个对象的改变能够影响其他对象\r发生改变的对象称为观察目标,被通知的对象称为观察者\r一个观察目标可以对应多个观察者

观察者模式概述

观察者模式的定义\r\r\r\r\r\r对象行为型模式

观察者模式概述

观察者模式的定义\r别名\r发布-订阅(Publish/Subscribe)模式\r模型-视图(Model/View)模式\r源-监听器(Source/Listener)模式\r从属者(Dependents)模式

观察者模式的结构与实现

观察者模式的结构\r\r

观察者模式的结构与实现

观察者模式的结构\r观察者模式包含以下4个角色:\rSubject(目标)\rConcreteSubject(具体目标)\rObserver(观察者)\rConcreteObserver(具体观察者)\r

观察者模式的结构与实现

观察者模式的实现\r典型的抽象目标类代码:

观察者模式的结构与实现

观察者模式的实现\r典型的具体目标类代码:

观察者模式的结构与实现

观察者模式的实现\r典型的抽象观察者代码:

观察者模式的结构与实现

观察者模式的实现\r典型的具体观察者代码:

观察者模式的结构与实现

观察者模式的实现\r说明:\r有时候在具体观察者类ConcreteObserver中需要使用到具体目标类ConcreteSubject中的状态(属性),会存在关联或依赖关系\r如果在具体层之间具有关联关系,系统的扩展性将受到一定的影响,增加新的具体目标类有时候需要修改原有观察者的代码,在一定程度上违背了开闭原则,但是如果原有观察者类无须关联新增的具体目标,则系统扩展性不受影响\r

观察者模式的结构与实现

观察者模式的实现\r典型的客户端代码片段:

观察者模式的应用实例

实例说明

观察者模式的应用实例

实例分析及类图\r战队成员之间的联动过程:\r联盟成员受到攻击 ? 发送通知给盟友 ? 盟友做出响应

观察者模式的应用实例

实例分析及类图

多人联机对战游戏结构图

观察者模式的应用实例

实例代码\r(1) AllyControlCenter:指挥部(战队控制中心)类,充当抽象目标类\r(2) ConcreteAllyControlCenter:具体指挥部类,充当具体目标类\r(3) IObserver:抽象观察者类\r(4) Player:战队成员类,充当具体观察者类\r(5) Program:客户端测试类

演示……

参考代码 (DesignPattern\ObserverSample)

观察者模式的应用实例

结果及分析\r两次对象之间的联动,触发链: Player.BeAttacked() ? AllyControlCenter.NotifyObserver() ? Player.Help()\r\r\r\r

观察者模式与.NET中的委托事件模型

分析\r事件源对象充当观察目标角色,委托对象充当抽象观察者角色,事件处理对象充当具体观察者角色\r如果事件源对象的某个事件触发,则调用事件处理对象中的事件处理程序来对事件进行处理\r\r\r

观察者模式与.NET中的委托事件模型

分析\rC#事件注册方法语法:\r\reventSource表示事件源,someEvent表示定义在事件源中的事件,SomeEventHandler表示用于处理事件的委托,someMethod表示与委托SomeEventHandler具有相同函数签名的事件处理方法\r只需要修改someMethod,即可实现相同的事件对应不同的事件处理程序\r.NET中的事件处理模型是观察者模式的一种变形,它与观察者模式的实现原理本质上是一致的\r\r

观察者模式与.NET中的委托事件模型

实例:自定义事件\r(1) EventTest:包含委托和事件的类\r(2) Program:客户端测试类\r

演示……

参考代码 (DesignPattern\ObserverExtend)

观察者模式与MVC

MVC(Model-View-Controller)架构\r模型(Model),视图(View)和控制器(Controller)\r模型可对应于观察者模式中的观察目标,而视图对应于观察者,控制器可充当两者之间的中介者\r当模型层的数据发生改变时,视图层将自动改变其显示内容\r\r\r\r

MVC结构示意图

观察者模式的优缺点与适用环境

模式优点\r可以实现表示层和数据逻辑层的分离\r在观察目标和观察者之间建立一个抽象的耦合\r支持广播通信,简化了一对多系统设计的难度\r符合开闭原则,增加新的具体观察者无须修改原有系统代码,在具体观察者与观察目标之间不存在关联关系的情况下,增加新的观察目标也很方便\r

观察者模式的优缺点与适用环境

模式缺点\r将所有的观察者都通知到会花费很多时间\r如果存在循环依赖时可能导致系统崩溃\r没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而只是知道观察目标发生了变化\r

观察者模式的优缺点与适用环境

模式适用环境\r一个抽象模型有两个方面,其中一个方面依赖于另一个方面,将这两个方面封装在独立的对象中使它们可以各自独立地改变和复用\r一个对象的改变将导致一个或多个其他对象发生改变,且并不知道具体有多少对象将发生改变,也不知道这些对象是谁\r需要在系统中创建一个触发链\r

END

Thanks!