设计者模式--观察者模式
来源:互联网 发布:淘宝模特红人余潇潇 编辑:程序博客网 时间:2024/09/21 09:17
一,定义:
观察者模式又叫发布-订阅模式(Publish/Subscribe)
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主体对象在状态发生变化时,会通知所有的观察者对象,是他们能够自动更新自己
观察者模式一般会牵扯至少两个角色Subject或Publish,叫做具体主题或通知者,将所有有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知
observer或subscribe类,具体观察者.
二:作用:
观察者模式所做的工作其实就是在解耦合.让耦合的双方都依赖于抽象,而不是依赖具体.从而使得各自的变化都不会影响另一边的变化
三,例子:
1,使用接口
interface Subject { void Notify(); string SubjectState { get; set; } } delegate void PatrolHander(); class Teacher : Subject { public event PatrolHander UpdateEvent; public string SubjectState { get; set; } public void Notify() { if (UpdateEvent != null) { UpdateEvent(); } } } class Student { private string name; private Subject sub; public Student(string name, Subject sub) { this.name = name; this.sub = sub; } public void Study() { Console.WriteLine("{0},{1}开始学习", sub.SubjectState, name); } } class Client { static void Main(string[] args) { Teacher t = new Teacher(); Student s = new Student("ad", t); t.SubjectState = "老师来了"; t.UpdateEvent += s.Study; t.Notify(); Console.ReadKey(); } }
2,类似1,才有中间加类,隔离.
例子(猫捉老鼠):
class Cat { //委托 public delegate void CatShout(object sender,CatShoutEventArgs args); //基于委托定义事件 public event CatShout CatShoutEvent; public string name; public Cat(string name){ this.name = name; } public void Shout() { Console.WriteLine("喵,我是{0}", this.name); //说明该事件有人订阅 if (CatShoutEvent != null) { CatShoutEventArgs arg = new CatShoutEventArgs(); arg.Name = this.name; CatShoutEvent(this,arg); } } } class Mouse { private string name; public Mouse(string name) { this.name = name; } public void Run(object sender,CatShoutEventArgs arg) { Console.WriteLine("{0}来了,{1}快跑",arg.Name, this.name); } } class CatShoutEventArgs:EventArgs { private string name; public string Name { set { name = value; } get { return name; } } } class Program { static void CatWithMouse() { Cat tom = new Cat("Tom"); Cat jim = new Cat("Jim"); //老鼠 Mouse jerry = new Mouse("Jerry"); Mouse jack = new Mouse("jack"); //订阅事件 tom.CatShoutEvent += jerry.Run; jim.CatShoutEvent += jack.Run; //tom来了 tom.Shout(); //jim来了 jim.Shout(); } static void Main(string[] args) { Program.CatWithMouse(); Console.ReadKey(); } }
阅读全文
0 0
- 设计者模式--观察者模式
- 常用设计者模式---观察者模式
- 设计者模式
- 设计者模式
- 设计者模式
- 设计者模式测试
- java-设计者模式
- 常用设计者模式---策略模式
- 常用设计者模式---命令模式
- 常用设计者模式---适配器模式
- 设计者模式-单例模式
- **** 读书计划 **** Javascript 设计者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- Mybatis实现数据的增删改查(CRUD)
- TabLayout属性详解以及使用用法
- JQuery实现全选/全不选,取消子checkbox时,全选checkbox取消对勾号
- postman中获取返回结果中参数,并传给下一个接口用例
- 欢迎使用CSDN-markdown编辑器
- 设计者模式--观察者模式
- HMI全液晶仪表时代-在QNX平台下的kanzi的UI设计解决方案
- 转载大牛的背包九讲
- 学生系统优化2
- ubuntu修改ssh远程连接端口号
- apple mach -o linker(id) error 错误解决办法收集
- ARM NEON 编程系列9——ARM C语言编程优化策略(神文)
- caffe-ssd在win10+vs2013+GPU的安装
- 线性是线性,顺序是顺序,线性是逻辑结构,顺序是存储结构,