博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者(Observer)模式 * 委托事件
阅读量:5248 次
发布时间:2019-06-14

本文共 4817 字,大约阅读时间需要 16 分钟。

 

观察者(Observer)模式:定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象。

     这个主题对象发生变化时会通知所有观察者对象,使他们字段更新自己

/*

* 抽象主题(Subject)角色:主题角色把所有对观察考对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。
  抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者(Observable)角色,一般用一个抽象类或者一个接口实现。
* 抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。
  抽象观察者角色一般用一个抽象类或者一个接口实现。在这个示意性的实现中,更新接口只包含一个方法(即Update()方法),这个方法叫做更新方法。
* 具体主题(ConcreteSubject)角色:将有关状态存入具体现察者对象;
  在具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫做具体被观察者角色(Concrete Observable)。
  具体主题角色通常用一个具体子类实现。
* 具体观察者(ConcreteObserver)角色:存储与主题的状态自恰的状态。具体现察者角色实现抽象观察者角色所要求的更新接口,
  以便使本身的状态与主题的状态相协调。如果需要,具体现察者角色可以保存一个指向具体主题对象的引用。
  具体观察者角色通常用一个具体子类实现。
*/

 

Console.WriteLine("\n =========实例2========== \n");            Secretary1 tongzzhe = new Secretary1();            StockObserver stock = new StockObserver("张某某", tongzzhe);            NBAObserver nba = new NBAObserver("王某某", tongzzhe);            tongzzhe.Attach(stock);            tongzzhe.Attach(nba);            tongzzhe.SubjectText = "老板回来了";            tongzzhe.Notify();            Console.ReadLine();     //抽象通知者 -- 接口    public interface Subject1    {        //增加        void Attach(Observer1 observer1);        void Remove(Observer1 observer1);        void Notify();        string SubjectText        { get; set; }    }    //通知者    public class Secretary1 : Subject1    {        //通知列表        private List
observers = new List
(); //增加 public void Attach(Observer1 observer1) { observers.Add(observer1); } public void Remove(Observer1 observer1) { observers.Remove(observer1); } //通知 public void Notify() { foreach (Observer1 o in observers) o.Update(); } public string SubjectText { get; set; } } //抽象观察者 public abstract class Observer1 { protected string name; protected Subject1 sub; public Observer1(string name, Subject1 sub) { this.name = name; this.sub = sub; } public abstract void Update(); } //看股票同事 public class StockObserver : Observer1 { public StockObserver(string name, Subject1 sub) : base(name, sub) { } public override void Update() { Console.WriteLine("{0},{1} 关闭股票,继续工作。", sub.SubjectText,name); } } //看NBA同事 public class NBAObserver : Observer1 { public NBAObserver(string name, Subject1 sub) : base(name, sub) { } public override void Update() { Console.WriteLine("{0},{1} 关闭NBA,继续工作。", sub.SubjectText, name); } }

 

观察者模式的演变。  具体观察者 也就是StockObserver 其实就是为 事件提供方法。

 

Console.WriteLine("\n =========实例2========== \n");            Secretary1 tongzzhe = new Secretary1();            StockObserver stock = new StockObserver("张某某", tongzzhe);            NBAObserver nba = new NBAObserver("王某某", tongzzhe);            tongzzhe.Attach(stock.Update);             tongzzhe.Attach(nba.Update);            tongzzhe.SubjectText = "老板回来了";            tongzzhe.Notify();     //抽象通知者 -- 接口    public interface Subject1    {         void Notify();         string SubjectText        { get; set; }    }    public delegate void EventHandler();    //通知者    public class Secretary1 : Subject1    {        // 声明事件;         public event EventHandler eventHandler;         //通知列表        private List
observers = new List
(); //增加 public void Attach(EventHandler observer1) { eventHandler += observer1; } public void Remove(EventHandler observer1) { eventHandler -= observer1; } //通知 public void Notify() { if (eventHandler != null) eventHandler(); } public string SubjectText { get; set; } } //抽象观察者 public abstract class Observer1 { protected string name; protected Subject1 sub; public Observer1(string name, Subject1 sub) { this.name = name; this.sub = sub; } public abstract void Update(); } //看股票同事 public class StockObserver : Observer1 { public StockObserver(string name, Subject1 sub) : base(name, sub) { } public override void Update() { Console.WriteLine("{0},{1} 关闭股票,继续工作。", sub.SubjectText,name); } } //看NBA同事 public class NBAObserver : Observer1 { public NBAObserver(string name, Subject1 sub) : base(name, sub) { } public override void Update() { Console.WriteLine("{0},{1} 关闭NBA,继续工作。", sub.SubjectText, name); } }

 

 

 

 

转载于:https://www.cnblogs.com/dragon-L/p/3783538.html

你可能感兴趣的文章
性能调优攻略
查看>>
给我们的Empty Object加个图标
查看>>
深入理解Java中的String
查看>>
Centos7安装并配置mysql5.6完美教程
查看>>
iOS 锁屏判断
查看>>
NFC身份证识别(二)
查看>>
转载--Typecho install.php 反序列化导致任意代码执行
查看>>
dsoframer组件详细使用(aspx.net)
查看>>
CodeForces 706C Hard problem
查看>>
【VMware vSphere】vSphere Data Protection简介
查看>>
javascript 模拟java 实现继承的5种方式
查看>>
软件工程课程设计团队项目总结与项目报告
查看>>
Min_25 筛 学习笔记
查看>>
微信小程序购物商城系统开发系列-目录结构
查看>>
人际交往能力:远比你想象的重要
查看>>
node起步
查看>>
SharedPreferences详解
查看>>
Agc011_C Squared Graph
查看>>
虚拟机性能监控与故障处理工具
查看>>
Codeforces Round #226 (Div. 2)C. Bear and Prime Numbers
查看>>