C#设计模式—观察者模式
2016-06-26 19:12
337 查看
1、观察者模式定义
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。属于对象行为模式。
2、观察者模式
1)目标类(Subject):指的是被观察的对象,定义一个观察者的集合。一个观察目标可以被多个观察者观察。目标提供一系列方法来增加和删除观察者对象。目标类可以是接口类,也可以是抽象了或具体类。
2)具体目标类(ConcreteSubject):具体目标是目标类的子类,通常包含经常发生改变的数据,当具体目标类的状态发生改变时,将向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务方法。
3)管擦者类(Observer):对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法Update(),因此又称为抽象观察者。
4)具体观察者类(ConcreteObserver):在具体观察者中维护一个指向具体目标对象的引用,用来存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致。
3、应用实例
在某多人联机对战游戏中,多个玩家可以加入同一战队组成联盟,当战队的某一成员受到敌人攻击时,将给其他盟友发送通知,盟友受到通知后将做出响应。
其中角色分配:AllyControlCenter:战队指挥中心,充当抽象目标;ConcreteAllyControlCenter:具体指挥部,充当具体目标类;IObserver:观察者;Player:具体观察者,即队员。
应用实例链接:http://download.csdn.net/detail/qq_30507287/9560143
4、观察者模式优点
1)可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。
2)观察目标和观察者之间建立一个抽象的耦合,观察目标只需要维持一个抽象观察者的集合,无须了解具体观察者。
3)支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化一对多系统设计的难度。
4)符合开闭原则。
5、观察者模式缺点
1)如果在观察者和目标者之间存在循环依赖,观察目标会触发它们进行循环调用,可能会导致系统崩溃。
2)观察者只知道目标对象发生了变化,但是不知道目标发生了什么样的变化。
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。属于对象行为模式。
2、观察者模式
1)目标类(Subject):指的是被观察的对象,定义一个观察者的集合。一个观察目标可以被多个观察者观察。目标提供一系列方法来增加和删除观察者对象。目标类可以是接口类,也可以是抽象了或具体类。
2)具体目标类(ConcreteSubject):具体目标是目标类的子类,通常包含经常发生改变的数据,当具体目标类的状态发生改变时,将向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务方法。
3)管擦者类(Observer):对观察目标的改变做出反应,观察者一般定义为接口,该接口声明了更新数据的方法Update(),因此又称为抽象观察者。
4)具体观察者类(ConcreteObserver):在具体观察者中维护一个指向具体目标对象的引用,用来存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致。
3、应用实例
在某多人联机对战游戏中,多个玩家可以加入同一战队组成联盟,当战队的某一成员受到敌人攻击时,将给其他盟友发送通知,盟友受到通知后将做出响应。
其中角色分配:AllyControlCenter:战队指挥中心,充当抽象目标;ConcreteAllyControlCenter:具体指挥部,充当具体目标类;IObserver:观察者;Player:具体观察者,即队员。
应用实例链接:http://download.csdn.net/detail/qq_30507287/9560143
4、观察者模式优点
1)可以实现表示层和数据逻辑层的分离,定义了稳定的消息更新传递机制,并抽象了更新接口,使得可以有各种各样不同的表示层充当具体观察者角色。
2)观察目标和观察者之间建立一个抽象的耦合,观察目标只需要维持一个抽象观察者的集合,无须了解具体观察者。
3)支持广播通信,观察目标会向所有已注册的观察者对象发送通知,简化一对多系统设计的难度。
4)符合开闭原则。
5、观察者模式缺点
1)如果在观察者和目标者之间存在循环依赖,观察目标会触发它们进行循环调用,可能会导致系统崩溃。
2)观察者只知道目标对象发生了变化,但是不知道目标发生了什么样的变化。
相关文章推荐
- C#Winform利用DataGridView的特性实现字段排序
- c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
- 派生类的构造函数
- C# 读写TXT文件遇到乱码问题
- C# Task
- C#并行编程-并发集合
- C# 读取EXCEL文件的三种经典方法
- C#泛型参数的约束
- Async in C# 5.0(C#中的异步编程Async) 蜗牛翻译之第一章
- C# 一个数组未赋值引发的错误
- 如何用C#将输出到文本文件中的内容换行?
- c#在已有图片上打水印打码打矩形区域标记等
- C# MP3播放帮助类
- C#关于圆与圆的交点问题
- 基于c#环境的单片机和PC串口通信
- 详解C#编程中的反射机制与方法
- 《C#高级编程》读书笔记(五):运算符
- C# Lambda表达式
- 《C#高级编程》读书笔记(四):关于数组
- c#怎样利用this.Invoke()方法,用委托调用带参数的方法?new ParameterizedThreadStart()除外