博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式
阅读量:5874 次
发布时间:2019-06-19

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

观察者模式

class Program    {        static void Main(string[] args)        {            ConcreteSubject s = new ConcreteSubject();            s.Attach(new ConcreteObserver(s, "X"));            s.Attach(new ConcreteObserver(s, "Y"));            s.Attach(new ConcreteObserver(s, "Z"));            s.SubjectState = "ABC";            s.Notify();            Console.Read();        }    }    abstract class Subject    {        private IList
observers = new List
(); //增加观察者 public void Attach(Observer observer) { observers.Add(observer); } //移除观察者 public void Detach(Observer observer) { observers.Remove(observer); } //通知 public void Notify() { foreach (Observer o in observers) { o.Update(); } } } //具体通知者 class ConcreteSubject : Subject { private string subjectState; //具体通知者状态 public string SubjectState { get { return subjectState; } set { subjectState = value; } } } abstract class Observer { public abstract void Update(); } class ConcreteObserver : Observer { private string name; private string observerState; private ConcreteSubject subject; public ConcreteObserver( ConcreteSubject subject, string name) { this.subject = subject; this.name = name; } //更新 public override void Update() { observerState = subject.SubjectState; Console.WriteLine("观察者{0}的新状态是{1}", name, observerState); } public ConcreteSubject Subject { get { return subject; } set { subject = value; } } }

烧水事件

// 热水器    public class Heater    {        private int temperature;        public string type = "RealFire 001";              // 添加型号作为演示        public string area = "China Xian";                     // 添加产地作为演示        //声明委托        public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e);        public event BoiledEventHandler Boiled;       //声明事件        // 定义BoliedEventArgs类,传递给Observer所感兴趣的信息        public class BoliedEventArgs : EventArgs        {            public readonly int temperature;            public BoliedEventArgs(int temperature)            {                this.temperature = temperature;            }        }        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视        protected virtual void OnBolied(BoliedEventArgs e)        {            if (Boiled != null)            {       // 如果有对象注册                Boiled(this, e);       // 调用所有注册对象的方法            }        }        // 烧水。        public void BoilWater()        {            for (int i = 0; i <= 100; i++)            {                temperature = i;                if (temperature > 95)                {                    //建立BoliedEventArgs 对象。                    BoliedEventArgs e = new BoliedEventArgs(temperature);                    OnBolied(e);       // 调用 OnBolied方法                }            }        }    }    // 警报器    public class Alarm    {        public void MakeAlert(Object sender, Heater.BoliedEventArgs e)        {            Heater heater = (Heater)sender;              //这里是不是很熟悉呢?            //访问 sender 中的公共字段            Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);            Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);            Console.WriteLine();        }    }    // 显示器    public class Display    {        public static void ShowMsg(Object sender, Heater.BoliedEventArgs e)        {       //静态方法            Heater heater = (Heater)sender;            Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);            Console.WriteLine();        }    }    class Program    {        static void Main()        {            Heater heater = new Heater();            Alarm alarm = new Alarm();            heater.Boiled += alarm.MakeAlert;       //注册方法            heater.Boiled += (new Alarm()).MakeAlert;              //给匿名对象注册方法            heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);       //也可以这么注册            heater.Boiled += Display.ShowMsg;              //注册静态方法            heater.BoilWater();       //烧水,会自动调用注册过对象的方法            Console.Read();        }    }

猫叫事件

http://www.tracefact.net/Design-Pattern/Observer.aspx

 

转载地址:http://abzix.baihongyu.com/

你可能感兴趣的文章
配置android开发环境eclipse获取ADT获取不到
查看>>
android获取string.xml的值
查看>>
Android Bluetooth 学习(1)底层协议模块与层次划分
查看>>
分析drop col对于数据存储块做了什么
查看>>
Informix数据库的乱码问题
查看>>
HashMap详解
查看>>
关于构造函数的测试和小结
查看>>
查看oracle数据库中正在执行的sql语句
查看>>
I帧 P帧 B帧的判断
查看>>
thymeleaf 不检查html语法错误
查看>>
小菜学设计模式——单例模式
查看>>
搭建Maven私服(Nexus)
查看>>
Quartz2.x(包括1.x)开发(调度器数据保存在持久层)出现的问题
查看>>
HomeStead Nginx配置ThinkPHP5
查看>>
中小企业实施云计算ERP的一些对策
查看>>
带你走进java集合之HashMap
查看>>
高考来临,理科老师手中不能没有它!
查看>>
poj 1821 - dp,单调队列
查看>>
《编写可维护的 JavaScript》读书笔记第17章:文件精简和压缩
查看>>
悼念一代巨匠:苹果之父乔布斯的语录
查看>>