浅谈设计模式之观察者模式
2016-05-20 21:01
344 查看
观察者模式将对象与对象之间创建一种依赖关系,当其中一个对象发生变化时,它会将这个变化通知给与其创建关系的对象中,实现自动化的通知更新。
观察者模式又被称为发布-订阅模式,这个叫法应该更好理解,比如说订报,出版社出版了每天的报纸,会将报纸统一发放给所有订阅了这份报纸的客户。只要订阅了这份报纸的人都会收到报纸,没有订阅当然也就不会收到报纸,当然,你单独买的不算==
UML图如下:
除此之外,这种模式还可以结合事件委托(C#),实现更为强大的功能。这里可以简单介绍一下委托,这玩意感觉可以类似于指针来理解,只不过委托指向的变量是函数名,而且委托也有自己的要求,委托对象所搭载的方法必须具有相同的参数列表和返回值。你可能还是不太理解,没关系,看下下面的代码也许能够帮助你理解。
当一个对象的改变需要同时改变其他对象的状态,并且不知道具体要改变的对象到底有多少个的时候就应该考虑使用观察者模式。也就是拥有一个发布者和多个订阅者。观察者模式将这种有依赖关系的两者封装在两个对立的对象中,使其各自独立地变化。这个模式应用很广泛,就拿我平时做的游戏来说,一些小红点的新通知,成就系统都可以应用这种模式。
总的来说,它所作工作就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
参考书籍:《大话设计模式》
观察者模式又被称为发布-订阅模式,这个叫法应该更好理解,比如说订报,出版社出版了每天的报纸,会将报纸统一发放给所有订阅了这份报纸的客户。只要订阅了这份报纸的人都会收到报纸,没有订阅当然也就不会收到报纸,当然,你单独买的不算==
UML图如下:
除此之外,这种模式还可以结合事件委托(C#),实现更为强大的功能。这里可以简单介绍一下委托,这玩意感觉可以类似于指针来理解,只不过委托指向的变量是函数名,而且委托也有自己的要求,委托对象所搭载的方法必须具有相同的参数列表和返回值。你可能还是不太理解,没关系,看下下面的代码也许能够帮助你理解。
//定义接口 interface Subject { string SubjectStte{set; get;} void Notify(); } //定义发布者(被观察者)类 class Publisher:Subject { //声明一个委托事件 delegate void EventHander(); //Update就相当于一个抽象的指针引用者 public event EventHander Update; //被发布者的主题状态 string action; public string SubjectState{ set{ action = value; } get{ return action; } } //呼叫所有订阅者 public void Notify(){ Update(); } } //定义订阅者(观察者)类 class Observer { string name; Subject sub; public Observer(string name,Subject sub){ this.name = name; this.sub = sub; } public void Behavior(){ Print(sub + name); } } //测试代码 static void Main(string[] args) { //发布者 Publisher pub = new Publisher(); //订阅者 Observer ob = new Observer("name",pub); //委托实现,注意:Update和Behavior的参数可返回值是相同的 pub.Update += ob.Behavior; //这里还可以增加其他的很多委托事件 //pub.Update += ob.Behavior2;…… //更新订阅状态 pub.SubjectState = "Name"; //通知订阅者改变状态 pub.Notify(); Console.Read(); }
当一个对象的改变需要同时改变其他对象的状态,并且不知道具体要改变的对象到底有多少个的时候就应该考虑使用观察者模式。也就是拥有一个发布者和多个订阅者。观察者模式将这种有依赖关系的两者封装在两个对立的对象中,使其各自独立地变化。这个模式应用很广泛,就拿我平时做的游戏来说,一些小红点的新通知,成就系统都可以应用这种模式。
总的来说,它所作工作就是在解除耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,从而使得各自的变化都不会影响另一边的变化。
参考书籍:《大话设计模式》
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用