观察者模式
来源:互联网 发布:淘宝上可以买彩票吗 编辑:程序博客网 时间:2024/06/03 19:26
一、生活中的观察者模式
比如我们使用的微信订阅号,关注订阅号的就是观察者,在订阅号上发布信息的就是发布者(主题对象),还有微博、qq关注好友等这些都是观察者模式的应用,只要主题对象发生了变化,观察者就会得知变化。
二、观察者模式
1、观察者模式定义
在生活中,只要有关注了订阅号客户端,如果订阅号有什么更新,就是直接推送给订阅了的用户;
观察者模式是一种一对多的依赖关系,一个主题对象被多个观察者对象同时监听,主题对象的状态发生变化时,会通知所有的观察者对象,使它们自动更新自己的行为。
2、观察者模式者的角色
抽象主题:主要是把所有观察者需要的引用汇集在一起,每个主题都有多个观察者,抽象主题提供一个接口,可以增加和删除观察者对象
具体主题:将具体主题的状态存入到具体的观察者对象,具体主题对象状态变更时,通知所有注册的观察者对象
抽象观察者:为所有具体观察者定义一个接口,主题对象发出通知时更新具体观察者对象。
具体观察者:主要实现抽象观察者的接口,以便主题对象发出通知时,本身能够更新状态,与主题对象协调一致。
3、关键点
(1)定义观察者和被观察者接口,有利于各自的扩展
(2)重要的被观察者(主题对象):定义观察者列表,以及观察者的添加和删除
定义通知观察者的方法,主题对象状态发生改变时通知观察者更新
4、代码
主题对象接口:
/// <summary> /// 发布者接口 /// </summary> public interface ISubject { void AddObserver(IObserver observer); //添加观察者 void RemoveObserver(IObserver observer);//移除观察者 void Nodify();//通知观察者的方法 }
具体主题对象:
public class Subject : ISubject { //用于保存订阅者的列表 private List<IObserver> observers = new List<IObserver>(); public string Msg { get; set; } public string Name { get; set; } public Subject(string name, string Msg) { this.Name = name; this.Msg = Msg; } public void AddObserver(ObserverDemo.IObserver observer) { observers.Add(observer); } public void RemoveObserver(ObserverDemo.IObserver observer) { observers.Remove(observer); } public void Nodify() { if (observers != null && observers.Count > 0) { //通知所有订阅者 foreach (IObserver observer in observers) { if(observer!=null) observer.Update(this); } } } }
观察者接口:
/// <summary> /// 订阅者接口 /// </summary> public interface IObserver { void Update(Subject subject); }
具体观察者:
public class Observer : IObserver { private string Name; public Observer(string name) { this.Name = name; } public void Update(Subject subject) { Console.WriteLine("用户:{0},【{1}】发来信息:{2}",Name,subject.Name,subject.Msg); } }
private void button1_Click(object sender, EventArgs e) { ISubject subject = new Subject("巴士公交","办卡9折优惠"); ISubject subject1 = new Subject("Linux学习","暑假班报名啦。。。。"); subject.AddObserver(new Observer("zhouyao")); subject1.AddObserver(new Observer("zhouyao")); subject.AddObserver(new Observer("小鱼")); subject.Nodify(); subject1.Nodify(); Console.ReadKey(); }
观察者模式在生活中到处常见。
阅读全文
0 0
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- CTF/合天网安实验室-web100题解【eval与alert的利用】
- webservice之实现一个基于JWS的webservice项目
- 知乎Matisse的使用
- SpringMVC注解
- 如何减少idea的内存消耗
- 观察者模式
- appium通过调用shell命令模拟按下物理键,时间可控。
- 如何使用Docker、Docker-Compose和Rancher搭建部署Pipeline(二)
- 聊聊Java中的Object类
- css样式换行整理
- pandas入门——数据切片
- node中的异步
- 17、集合框架——Set
- zcmu-1954