国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Observer設計模式范例詳解

開發 后端
本文通過范例詳細介紹了Observer設計模式的實現過程。

Observer設計模式說明

假設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候:1、揚聲器會開始發出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。

現在我們需要寫個程序來模擬這個燒水的過程,我們將定義一個類來代表熱水器,我們管它叫:Heater,它有代表水溫的字段,叫做temperature;當然,還有必不可少的給水加熱方法BoilWater(),一個發出語音警報的方法MakeAlert(),一個顯示水溫的方法,ShowMsg()。

  1. namespace Delegate {  
  2.     class Heater {  
  3.     private int temperature; // 水溫  
  4.     // 燒水  
  5.     public void BoilWater() {  
  6.         for (int i = 0; i < = 100; i++) {  
  7.            temperature = i;  
  8.  
  9.            if (temperature > 95) {  
  10.                MakeAlert(temperature);  
  11.                ShowMsg(temperature);  
  12.             }  
  13.         }  
  14.     }  
  15.  
  16.     // 發出語音警報  
  17.     private void MakeAlert(int param) {  
  18.        Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:" , param);  
  19.     }  
  20.       
  21.     // 顯示水溫  
  22.     private void ShowMsg(int param) {  
  23.        Console.WriteLine("Display:水快開了,當前溫度:{0}度。" , param);  
  24.     }  
  25. }  
  26.  
  27. class Program {  
  28.     static void Main() {  
  29.        Heater ht = new Heater();  
  30.        ht.BoilWater();  
  31.     }  
  32. }  

Observer設計模式簡介

上面的例子顯然能完成我們之前描述的工作,但是卻并不夠好。現在假設熱水器由三部分組成:熱水器、警報器、顯示器,它們來自于不同廠商并進行了組裝。那么,應該是熱水器僅僅負責燒水,它不能發出警報也不能顯示水溫;在水燒開時由警報器發出警報、顯示器顯示提示和水溫。

這時候,上面的例子就應該變成這個樣子:  

  1. // 熱水器  
  2. public class Heater {   
  3.     private int temperature;  
  4.           
  5.     // 燒水  
  6.     private void BoilWater() {  
  7.        for (int i = 0; i < = 100; i++) {  
  8.            temperature = i;  
  9.         }  
  10.     }  
  11. }  
  12.  
  13. // 警報器  
  14. public class Alarm{  
  15.     private void MakeAlert(int param) {  
  16.        Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:" , param);  
  17.     }  
  18. }  
  19.  
  20. // 顯示器  
  21. public class Display{  
  22.     private void ShowMsg(int param) {  
  23.        Console.WriteLine("Display:水已燒開,當前溫度:{0}度。" , param);  
  24.     }  

這里就出現了一個問題:如何在水燒開的時候通知報警器和顯示器?在繼續進行之前,我們先了解一下Observer設計模式,Observer設計模式中主要包括如下兩類對象:

Subject:監視對象,它往往包含著其他對象所感興趣的內容。在本范例中,熱水器就是一個監視對象,它包含的其他對象所感興趣的內容,就是temprature字段,當這個字段的值快到100時,會不斷把數據發給監視它的對象。

Observer:監視者,它監視Subject,當Subject中的某件事發生的時候,會告知Observer,而Observer則會采取相應的行動。在本范例中,Observer有警報器和顯示器,它們采取的行動分別是發出警報和顯示水溫。

在本例中,事情發生的順序應該是這樣的:

警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(注冊)。

熱水器知道后保留對警報器和顯示器的引用。

熱水器進行燒水這一動作,當水溫超過95度時,通過對警報器和顯示器的引用,自動調用警報器的MakeAlert()方法、顯示器的ShowMsg()方法。

類似這樣的例子是很多的,GOF對它進行了抽象,稱為Observer設計模式:Observer設計模式是為了定義對象間的一種一對多的依賴關系,以便于當一個對象的狀態改變時,其他依賴于它的對象會被自動告知并更新。Observer模式是一種松耦合的設計模式。

實現范例的Observer設計模式

我們之前已經對委托和事件介紹很多了,現在寫代碼應該很容易了,現在在這里直接給出代碼,并在注釋中加以說明。

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4.  
  5. namespace Delegate {  
  6.     // 熱水器  
  7.     public class Heater {  
  8.        private int temperature;  
  9.        public delegate void BoilHandler(int param);   //聲明委托  
  10.        public event BoilHandler BoilEvent;        //聲明事件  
  11.  
  12.        // 燒水  
  13.        public void BoilWater() {  
  14.            for (int i = 0; i < = 100; i++) {  
  15.               temperature = i;  
  16.  
  17.               if (temperature > 95) {  
  18.                   if (BoilEvent != null) { //如果有對象注冊  
  19.                       BoilEvent(temperature);  //調用所有注冊對象的方法  
  20.                   }  
  21.               }  
  22.            }  
  23.        }  
  24.     }  
  25.  
  26.     // 警報器  
  27.     public class Alarm {  
  28.        public void MakeAlert(int param) {  
  29.            Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:", param);  
  30.        }  
  31.     }  
  32.  
  33.     // 顯示器  
  34.     public class Display {  
  35.        public static void ShowMsg(int param) { //靜態方法  
  36.            Console.WriteLine("Display:水快燒開了,當前溫度:{0}度。", param);  
  37.        }  
  38.     }  
  39.       
  40.     class Program {  
  41.        static void Main() {  
  42.            Heater heater = new Heater();  
  43.            Alarm alarm = new Alarm();  
  44.  
  45.            heater.BoilEvent += alarm.MakeAlert;    //注冊方法  
  46.            heater.BoilEvent += (new Alarm()).MakeAlert;   //給匿名對象注冊方法  
  47.            heater.BoilEvent += Display.ShowMsg;       //注冊靜態方法  
  48.  
  49.            heater.BoilWater();   //燒水,會自動調用注冊過對象的方法  
  50.        }  
  51.     }  

輸出為:

  1. Alarm:嘀嘀嘀,水已經 96 度了:  
  2. Alarm:嘀嘀嘀,水已經 96 度了:  
  3. Display:水快燒開了,當前溫度:96度。  
  4. // 省略... 

【編輯推薦】

  1. C#調用SQL存儲過程示例演示
  2. C#與SQL連接:GridView控件操作
  3. ASP調用C# DLL發送郵件方法共享
  4. VC6.0和VS2005:C++和C#編寫調用COM組件
  5. C#中調用dll庫(VC編寫)
責任編輯:book05 來源: cnblogs
相關推薦

2009-08-26 10:24:04

C# Observer

2009-07-07 16:39:40

JDK Observe

2012-01-18 10:47:38

ibmdw

2021-06-29 08:54:23

設計模式代理模式遠程代理

2011-07-26 15:29:36

Cocoa 模式

2011-07-26 17:31:52

iOS 設計模式

2011-04-21 09:46:41

設計模式

2009-07-10 16:14:29

MVC設計模式Swing

2012-08-27 10:52:20

.NET架構觀察者模式

2010-01-21 09:08:53

.NET設計模式

2009-09-24 16:55:27

策略模式

2023-07-03 07:39:43

Spring框架設計模式

2021-07-29 14:42:55

設計模式Java

2009-08-14 09:40:55

MyEclipse整合

2021-08-04 06:56:49

工廠設計模式

2025-08-01 07:55:56

2023-09-22 11:58:49

2010-06-11 14:55:20

2021-02-01 10:01:58

設計模式 Java單例模式

2021-08-16 17:15:19

設計模式Android適配器模式
點贊
收藏

51CTO技術棧公眾號

一级黄色特级片| 亚洲精品五月天| 97成人精品区在线播放| а√在线中文网新版地址在线| 亚洲理论电影| 亚洲国产精品久久久久秋霞不卡| 国产黄色片大全| 精品一二线国产| 91亚洲精品久久久| 综合中文字幕| 亚洲网站视频福利| 日本最黄一级片免费在线| 中文字幕巨乱亚洲| 91超碰在线电影| 风间由美一区二区三区在线观看| 亚洲男女自偷自拍图片另类| 国产欧美va欧美va香蕉在| 78精品国产综合久久香蕉| 欧美日本在线一区| 日韩欧美在线123| 久久精品91久久香蕉加勒比| 国产理论电影在线观看| 中文在线资源观看网站视频免费不卡| 影音欧美亚洲| 久久大逼视频| 99精彩视频| 国产日产欧美一区二区| 日韩精品国产精品| 成人黄色在线播放| 国产精品不卡| 亚洲欧洲日本mm| 久久久不卡网国产精品二区| 亚洲一区三区在线观看| 国产精品国产一区| 2025国产精品视频| 国产亚洲精品久久飘花| 奇米色777欧美一区二区| 在线看av的网址| 中文文精品字幕一区二区| 国产精品国产亚洲精品看不卡| 日韩精品每日更新| 欧洲亚洲一区二区三区四区五区| 99视频在线精品国自产拍免费观看| 91久热免费在线视频| 亚洲视频在线免费| 国产精选在线观看91| 亚洲国产高清一区| 好吊色欧美一区二区三区 | 国产三级一区二区| 中文久久久久久| 亚洲欧美电影一区二区| 人成在线视频| 色哟哟一区二区三区| a视频网址在线观看| 欧美美女一区二区| 99re在线观看| 精品久久久久久亚洲国产300| 91精品国产高清一区二区三区蜜臀 | 亚洲专区中文字幕| 欧美天天综合| 成人午夜小视频| 极品尤物久久久av免费看| 久久免费视频1| 国产成人av在线影院| 日本www.色| 精品久久久久久久久久| 菠萝菠萝蜜在线观看| 精品国产免费视频| 深夜成人福利| 97国产精品视频| 欧美激情综合| www.国产二区| 亚洲精品自拍动漫在线| 国产三级在线看| 亚洲综合激情另类小说区| 欧美人与牛zoz0性行为| 免费亚洲一区二区| 91九色在线看| 久久精品久久久久久国产 免费| 在线精品国产亚洲| 国产999精品视频| 亚洲精品一区二区三区樱花 | 免费免费啪视频在线观看| 亚洲欧洲精品一区二区三区| 日韩大胆视频| 日韩黄色av网站| 国产一区二区三区精品在线观看| 国产精品一二三在线| 免费久久99精品国产| 91视频免费版污| 欧美色综合影院| 国产精品成人3p一区二区三区| 国产欧美日韩精品丝袜高跟鞋| 日韩成人av影视| 午夜两性免费视频| 91精品国产综合久久精品app| 99re6热只有精品免费观看| 亚洲三级免费| 久久久99免费| xxx.xxx欧美| 国产视频福利在线| 97久久精品人搡人人玩| 久久草av在线| 国产午夜视频在线观看| 女同一区二区| 亚洲午夜久久| 亚洲欧美日韩精品久久久| 国产欧美一区二区在线| 欧美日韩影视| 综合久久五月天| 亚洲精品一区二区妖精| 青青草国产精品视频| 91高清在线观看| 在线精品国产亚洲| 色综合男人天堂| 日韩欧美中文一区二区| 欧美亚洲视频| 久久亚洲欧美国产精品乐播| 一卡二卡三卡亚洲| 日韩中文视频免费在线观看| 国产精品theporn| 成年人视频网站| 日韩毛片在线看| 狠久久av成人天堂| 香蕉521av成人网| 最新国产精品亚洲| 美女精品在线| 污污网站在线| 欧美怡春院一区二区三区| 99精品久久免费看蜜臀剧情介绍| 日本高清在线观看视频| 国产伦精品一区二区三区免| 亚洲高清视频的网址| 在线日韩成人| 69sex久久精品国产麻豆| 日韩美女一区二区三区| 国产真实久久| 欧美女v视频| 成人在线国产精品| 亚洲最色的网站| 日韩免费成人| 少妇性饥渴无码a区免费| 中文亚洲视频在线| 国产专区综合网| 免费看男女www网站入口在线 | 国产视频在线一区二区| 香蕉成人久久| 激情影院在线观看| 99九九电视剧免费观看| 亚洲v中文字幕| 区一区二视频| 免费观看的av网站| 51精品国产黑色丝袜高跟鞋| 国产欧美日韩亚州综合 | 精品一区亚洲| 97操碰视频| 97av在线视频| 中文字幕一区二区三区四区| 荡女精品导航| 污视频免费在线观看网站| 欧美激情在线观看| 伊人网在线视频| 欧美日韩精品在线| 欧美电影免费播放| 视频一区二区三区在线看免费看| 国产日本欧美视频| 欧美性猛交xxxx乱大交3| 欧美激情一区| www在线视频| 亚洲 国产 欧美一区| 亚洲欧美日韩精品| 久久久亚洲精品石原莉奈 | 午夜老司机精品| 精品国产一区二区三区不卡| 秋霞国产午夜精品免费视频| 高清电影在线免费观看| 2021国产视频| 九色91av视频| 亚洲图片有声小说| 影音国产精品| 先锋成人av| 18禁免费观看网站| 性欧美xxxx| 日本精品免费观看高清观看| 久久久精品五月天| 91久久久久久白丝白浆欲热蜜臀| 亚洲人成无码www久久久| 国产97在线|亚洲| 一道本成人在线| 日韩av网站在线观看| 日韩国产一二三区| 1区不卡电影| 久久精品日产第一区二区三区 | 欧美国产精品| 91视频欧美| 奇米影视四色在线| 国产精华一区二区三区| 在线电影av不卡网址| 亚洲在线免费播放| 蜜臀91精品一区二区三区|