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 = ; 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 = ; i <= ; i++)
{
if (i >= )
{
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();
}
}
}
Observer观察者设计模式的更多相关文章
- 十七、 Observer 观察者设计模式
设计: 代码清单: Observer public interface Observer { void update(NumberGenerator generator); } DigitObserv ...
- Observer(观察者)设计模式[转]
Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容.在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是tempratu ...
- (java)从零开始之--观察者设计模式Observer
观察者设计模式:时当一个对象发生指定的动作时,要通过另外的对象做出相应的处理. 步骤: 1. A对象发生指定的动作是,要通知B,C,D...对象做出相应的处理,这时候应该把B,C,D...对象针对A对 ...
- 《Head First设计模式》批注系列(一)——观察者设计模式
最近在读<Head First设计模式>一书,此系列会引用源书内容,但文章内容会更加直接,以及加入一些自己的理解. 观察者模式(有时又被称为模型-视图(View)模式.源-收听者(List ...
- Java常用类库——观察者设计模式
观察者设计模式 现在很多的购房者都在关注着房子的价格变化,每当房子价格变化的时候,所有的购房者都可以观察得到.实际上以上的购房者都属于观察者,他们都关注着房子的价格. 如果要想实现观察者模式,则必须依 ...
- java学习之观察者设计模式
package com.gh.observer; import java.util.Observable; /** * 被观察者对象 * 必须继承被观察者抽象类 * @author ganhang * ...
- Unity 3D观察者设计模式-C#委托和事件的运用
C#观察者设计模式 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心创新! ...
- IOS设计模式第七篇之观察者设计模式
版权声明:原创作品,谢绝转载!否则将追究法律责任. 观察者设计模式 在观察者设计模式里面,一个对象通知其他的对象一些状态的改变.涉及这些对象不需要知道另一个对象---因此鼓励解耦设计模式.这个设计模式 ...
- java: 观察者模式:Observable被观察者,Observer观察者
java: 观察者模式:Observable被观察者,Observer观察者 以房子价格为例,卖房者为被观察者: import java.util.Observable; //被观察者子类化 publ ...
随机推荐
- 【Unity】1.1 安装Unity 5.3.4 开发环境
分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity分个人版(Personal)和专业版(Pro).个人版是免费的(部分高级功能受限,但初学者也用不到它),Pro ...
- 浅谈OCR之Tesseract
光 学字符识别(OCR,Optical Character Recognition)是指对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程.OCR技术非常专业,一般多是印刷.打印 ...
- Linux下一个简单sniffer的实现
Sniffer(嗅探器)是一种基于被动侦听原理的网络分析方式.将网络接口设置在监听模式,便可以将网上传输的源源不断的信息截获.对于网络监听的基本原理我们不在赘述,我们也不开启网卡的混杂模式,因为现在的 ...
- 相聚 桂林电子科技大学第三届ACM程序设计竞赛
题目链接:https://ac.nowcoder.com/acm/contest/558/D 就是求有多少块区域,用DFS就可以解决,一遇到一个1就从其开始深搜,将其所在的区域块覆灭(变为0),再遇到 ...
- SqlServer Session共享注意点
公司下派任务,之前的网站是一台服务器,由于用户过多,负载过大,现在老大要求多加一台服务器.加就加贝,应该跟我这DEV没有 关系吧,应该不会碰到Source的吧.但是,之前网站有一些数据是放在Sessi ...
- c# readkey readline read 区别
Console.read().Console.readline().Console.readkey()和Console.Write.Console.Writeline()的区别 Console.rea ...
- 利用MVC5+EF6搭建博客系统
https://www.cnblogs.com/wyt007/p/7880137.html
- .Net Core + DDD基础分层 + 项目基本框架 + 个人总结
为什么要写这篇文章 1,在大半年前,公司开发任务比较轻松,自己不知道干什么,但是又想要学习技术,比较迷茫,后面我接触到了博客园,看了一个帖子,深有感触,我当时不知道学习什么,于是我信息给他,他居然回复 ...
- C博客第03次作业---函数
1.本章学习总结 1.1 思维导图 1.2 本章学习体会及代码量学习体会 1.2.1 学习体会 首先,对于学习了函数的我来说是很开心的,因为学了函数之后可以解决很多以前不懂的问题,可以说函数是C语言中 ...
- Android代码编译出现的错误
一.decoupled apps failed 解耦应用程序失败 2.每次编译时候一定先扩充内存 export JACK_SERVER_VM_ARGUMENTS="-Dfile.encod ...