观察者模式的经典应用(猫叫 烧开水)
Code?貓叫了 老鼠跑 主人驚醒
?1/**//*
?2?*?題目:
?3?*?貓叫了,所有老鼠開始逃跑,主人被驚醒,請用OO的思想描繪此過程
?4?*?1,老鼠跟主人是被動的
?5?*?2,要考慮聯動性與擴展性
?6?*/
?7using?System;
?8using?System.Collections.Generic;
?9using?System.Text;
10
11namespace?CatCry?{
12
13????/**//*委托,當貓叫時將信息傳給所有觀察者*/
14????public?delegate?void?CatCryEventHandler(object?sender,?EventArgs?e);
15
16????/**//*被觀察對象*/
17????abstract?class?Subject?{
18????????public?event?CatCryEventHandler?CatCryEvent;//貓叫時的事件
19????????public?void?Cry(EventArgs?e)?{
20????????????this.CatCryEvent(this,?e);
21????????}
22????????public?void?Cry()?{
23????????????//不接收貓叫時發出的信息
24????????????this.CatCryEvent(this,?new?EventArgs());
25????????}
26????}
27
28????/**//*觀察者*/
29????abstract?class?Observer?{
30????????public?Observer()?{?}
31????????public?Observer(Subject?subject)?{
32????????????subject.CatCryEvent?+=?new?CatCryEventHandler(this.Notified);
33????????}
34????????//當貓叫時做出的反應(當收到通知時)
35????????abstract?protected?void?Notified(object?sender,?EventArgs?e);
36????}
37
38????/**//*定義貓作為被觀察對象*/
39????class?Cat?:?Subject?{
40????????public?Cat()?{?Console.WriteLine("貓叫了");?}
41????}
42
43????/**//*定義老鼠作為觀察者*/
44????class?Mouse?:?Observer?{
45????????string?mouseName;
46????????public?Mouse()?{?}
47????????public?Mouse(string?mouseName,?Subject?subject)
48????????????:?base(subject)?{
49????????????this.mouseName?=?mouseName;
50????????}
51????????override?protected?void?Notified(object?sender,?EventArgs?e)?{
52????????????Console.WriteLine(this.mouseName?+?"開始逃跑");
53????????}
54????}
55
56????/**//*定義主人作為觀察者*/
57????class?Marster?:?Observer?{
58????????public?Marster()?{?}
59????????public?Marster(Subject?subject)?:?base(subject)?{?}
60????????override?protected?void?Notified(object?sender,?EventArgs?e)?{
61????????????Console.WriteLine("主人被驚醒了");
62????????}
63????}
64
65????/**////?<summary>
66????///?功能:用觀察者模式實現
67????///?作者:allnen
68????///?時間:2008-6-5
69????///?</summary>
70????class?Program?{
71????????static?void?Main(string[]?args)?{
72????????????Cat?cat?=?new?Cat();
73????????????Mouse?m1?=?new?Mouse("老鼠1",?cat);
74????????????Mouse?m2?=?new?Mouse("老鼠2",?cat);
75
76????????????Marster?marster?=?new?Marster(cat);
77????????????cat.Cry();//貓叫了
78
79????????}
80????}
81}
code?? 燒開水
using System;
using System.Collections.Generic;
using System.Text;
namespace Delegate {
??? // 熱水器
??? public class Heater {
?????? private int temperature;
?????? public string type = "RealFire 001";?????? // 添加型號作為演示
?????? public string area = "China Xian";???????? // 添加產地作為演示
?????? //聲明委托
?????? public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
?????? public event BoiledEventHandler Boiled; //聲明事件
?????? // 定義BoiledEventArgs類,傳遞給Observer所感興趣的信息
?????? public class BoiledEventArgs : EventArgs {
?????????? public readonly int temperature;
?????????? public BoiledEventArgs(int temperature) {
????????????? this.temperature = temperature;
?????????? }
?????? }
?????? // 可以供繼承自 Heater 的類重寫,以便繼承類拒絕其他對象對它的監視
?????? protected virtual void OnBoiled(BoiledEventArgs e) {
?????????? if (Boiled != null) { // 如果有對象注冊
????????????? Boiled(this, e);? // 調用所有注冊對象的方法
?????????? }
?????? }
??????
?????? // 燒水。
?????? public void BoilWater() {
?????????? for (int i = 0; i <= 100; i++) {
????????????? temperature = i;
????????????? if (temperature > 95) {
????????????????? //建立BoiledEventArgs 對象。
????????????????? BoiledEventArgs e = new BoiledEventArgs(temperature);
????????????????? OnBoiled(e);? // 調用 OnBolied方法
????????????? }
?????????? }
?????? }
??? }
??? // 警報器
??? public class Alarm {
?????? public void MakeAlert(Object sender, Heater.BoiledEventArgs 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.BoiledEventArgs 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();?? //燒水,會自動調用注冊過對象的方法
?????? }
??? }
}
輸出為:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已經 96 度了:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已經 96 度了:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已經 96 度了:
Display:China Xian - RealFire 001:
Display:水快燒開了,當前溫度:96度。
轉載于:https://www.cnblogs.com/panbbb/archive/2008/11/10/1330695.html
總結
以上是生活随笔為你收集整理的观察者模式的经典应用(猫叫 烧开水)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电影疾速追杀里的一首歌,歌名叫啥,谁唱的
- 下一篇: 亏赚?有分必采纳