Observer观察者设计模式

Observer设计模式主要包括以下两种对象:

(1)被观察对象:Subject,它往往包含其他对象感兴趣的东西,上面例子中热水器中就是Subject(被监视对象);

(2)观察对象:Observer,它观察着Subject,当Subject中的某件事发生后,会告知Observer,Obersver会采取相应的行动。上面例子中显示器和报警器就是观察对象,当油箱中温度大于95°时,报警器和显示器就会做出相应的警报;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ObserverApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Oil o = new Oil();
            o.BoiledEvent += new Alarm().MakeAlarm;//先往Oil对象中注册事件
            o.BoiledEvent += new Display().ShowMsg;//先往Oil对象中注册事件
            o.BoilWater();//执行主要方法,等到条件合适在触发上面注册的事件
        }
    }

    /// <summary>
    /// Subject被观察对象   ---Oil热水器
    /// </summary>
    internal class Oil
    {
        /// <summary>
        /// 牌子
        /// </summary>
        public string brand = "Nick";

        /// <summary>
        /// 价格
        /// </summary>
        public int price = 1000;

        public delegate void BoiledHandler(object obj, EventArgs args);
        public event BoiledHandler BoiledEvent;

        /// <summary>
        /// 将观察者感兴趣的信息通过实例传递过去
        /// </summary>
        public class BoilEventArgs : EventArgs 
        {
            public int Temperature { get; set; }
            public BoilEventArgs(int temperature) 
            {
                this.Temperature = temperature;
            }
        }

        public void BoilWater() 
        {
            for (int i = 0; i <= 100; i++) 
            {
                if (i >= 95) 
                {
                    BoilEventArgs args = new BoilEventArgs(i);
                    BoiledEvent(this, args);//当温度达到95度及以上的时候,触发所有订阅该事件的观察者的方法
                }
            }
        }
    }

    /// <summary>
    /// Observer观察对象   ---警报器
    /// </summary>
    internal class Alarm 
    {
        public void MakeAlarm(object sender,EventArgs args) 
        {
            Oil o = (Oil)sender;
            ObserverApp.Oil.BoilEventArgs a = (ObserverApp.Oil.BoilEventArgs)args;
            Console.WriteLine("Alarm:嘀嘀嘀,水已经 {0} 度了,当前热水器的牌子是{1},价格是{2}",a.Temperature, o.brand, o.price);
        }
    }

    /// <summary>
    /// Observer观察对象   ---显示器
    /// </summary>
    internal class Display
    {
        public void ShowMsg(object sender, EventArgs args)
        {
            Oil o = (Oil)sender;
            ObserverApp.Oil.BoilEventArgs a = (ObserverApp.Oil.BoilEventArgs)args;
            Console.WriteLine("Display:水已烧开,当前温度:{0}度,当前热水器的牌子是{1},价格是{2}", a.Temperature, o.brand, o.price);
            Console.ReadKey();
        }
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hbbliyong

Extjs4处理后台json数据中日期和时间的方法

当ASP.NET后台使用JavaScriptSerializer这个组件将对象序列化为json,或者使用ScriptMethod特性的json      [Sc...

3887
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)

前一篇文章我们介绍了如何将创建产品的领域逻辑与产品的持久化仓储通过上架产品的用例组织起来,完成了一个功能。在实际的项目中,多种前端的形态比如PC Web、 微信...

3715
来自专栏烙馅饼喽的技术分享

关于怎么在10万个手机号码中选择重复号码的问题。

         刚才看到这篇博客。 http://www.cnblogs.com/WindBlog/archive/2011/07/21/2112452.h...

2845
来自专栏木宛城主

深入浅出三层架构

这几天看了不少三层架构的资料,整理整理 ——故写篇博文谈谈自己的看法。 三层架构概念: 三层架构(3-tier application) 通常意义上的三层架构就...

2415
来自专栏领域驱动设计DDD实战进阶

DDD实战进阶第一波(七):开发一般业务的大健康行业直销系统(实现产品上下文接口与测试)

1304
来自专栏知识分享

关于Http 传输二维json

然后就在想是不是   String str = jsonObject1.toString();    jsonObject.put("param",str); ...

1154
来自专栏跟着阿笨一起玩NET

Winform 实现像菜单一样弹出层

在实际工作中,如果能像菜单一样弹出自定义内容,会方便很多,比如查询时,比如下拉列表显示多列信息时,比如在填写某个信息需要查看一些信息树时。这个时候自定义弹出界面...

1181
来自专栏草根专栏

从头编写 asp.net core 2.0 web api 基础框架 (5) EF CRUD

Github源码地址:https://github.com/solenovex/Building-asp.net-core-2-web-api-starter-...

4006
来自专栏DOTNET

.Net多线程编程—任务Task

1 System.Threading.Tasks.Task简介 一个Task表示一个异步操作,Task的创建和执行是独立的。 只读属性: 返回值 ...

3695
来自专栏菩提树下的杨过

Linq to Sql中Single写法不当可能引起的数据库查询性能低下

场景:需要从T_User表中返回指字条件的某条记录的某一个字段 在Linq中有二种理论上都行得通的写法,见下面的代码: Code using (dbUserDa...

2136

扫码关注云+社区

领取腾讯云代金券