Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
C# ÖеÄίÍкÍʼþ£¨1£©
 
  3131  次浏览      28
 2018-1-10 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬Í¨¹ýÒ»¸öGreetingPeopleµÄС³ÌÐòÏò´ó¼Ò½éÉÜÁËίÍеĸÅÄίÍÐÓÃÀ´×öʲô£¬ËæºóÓÖÒý³öÁËʼþ£¬½Ó×ŶÔίÍÐÓëʼþËù²úÉúµÄÖмä´úÂë×öÁË´ÖÂԵĽ²Êö¡£

ÒýÑÔ

ίÍÐ ºÍ ʼþÔÚ .Net FrameworkÖеÄÓ¦Ó÷dz£¹ã·º£¬È»¶ø£¬½ÏºÃµØÀí½âίÍкÍʼþ¶ÔºÜ¶à½Ó´¥C#ʱ¼ä²»³¤µÄÈËÀ´Ëµ²¢²»ÈÝÒס£ËüÃǾÍÏñÊÇÒ»µÀ¼÷¶ù£¬¹ýÁËÕâ¸ö¼÷µÄÈË£¬¾õµÃÕæÊÇÌ«ÈÝÒ×ÁË£¬¶øÃ»ÓйýÈ¥µÄÈËÿ´Î¼ûµ½Î¯ÍкÍʼþ¾Í¾õµÃÐÄÀï±ð£¨bi¨¨£©µÃ»Å£¬»ìÉí²»×ÔÔÚ¡£±¾ÎÄÖУ¬ÎÒ½«Í¨¹ýÁ½¸ö·¶ÀýÓÉdzÈëÉîµØ½²ÊöʲôÊÇίÍС¢ÎªÊ²Ã´ÒªÊ¹ÓÃίÍС¢Ê¼þµÄÓÉÀ´¡¢.Net FrameworkÖеÄίÍкÍʼþ¡¢Î¯ÍкÍʼþ¶ÔObserverÉè¼ÆÄ£Ê½µÄÒâÒ壬¶ÔËüÃǵÄÖмä´úÂëÒ²×öÁËÌÖÂÛ¡£

½«·½·¨×÷Ϊ·½·¨µÄ²ÎÊý

ÎÒÃÇÏȲ»¹ÜÕâ¸ö±êÌâÈçºÎµÄÈÆ¿Ú£¬Ò²²»¹ÜίÍо¿¾¹ÊǸöʲô¶«Î÷£¬À´¿´ÏÂÃæÕâÁ½¸ö×î¼òµ¥µÄ·½·¨£¬ËüÃDz»¹ýÊÇÔÚÆÁÄ»ÉÏÊä³öÒ»¾äÎʺòµÄ»°Ó

public void GreetPeople(string name) {
// ×öijЩ¶îÍâµÄÊÂÇ飬±ÈÈç³õʼ»¯Ö®À࣬´Ë´¦ÂÔ
EnglishGreeting(name);
}
public void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}

ÔÝÇÒ²»¹ÜÕâÁ½¸ö·½·¨ÓÐûÓÐʲôʵ¼ÊÒâÒå¡£GreetPeopleÓÃÓÚÏòijÈËÎʺ㬵±ÎÒÃÇ´«µÝ´ú±íijÈËÐÕÃûµÄname²ÎÊý£¬±ÈÈç˵¡°Jimmy¡±£¬½øÈ¥µÄʱºò£¬ÔÚÕâ¸ö·½·¨ÖУ¬½«µ÷ÓÃEnglishGreeting·½·¨£¬Ôٴδ«µÝname²ÎÊý£¬EnglishGreetingÔòÓÃÓÚÏòÆÁÄ»Êä³ö ¡°Morning, Jimmy¡±¡£

ÏÖÔÚ¼ÙÉèÕâ¸ö³ÌÐòÐèÒª½øÐÐÈ«Çò»¯£¬°¥Ñ½£¬²»ºÃÁË£¬ÎÒÊÇÖйúÈË£¬ÎÒ²»Ã÷°×¡°Morning¡±ÊÇʲôÒâ˼£¬Ôõô°ìÄØ£¿ºÃ°É£¬ÎÒÃÇÔÙ¼Ó¸öÖÐÎİæµÄÎʺò·½·¨£º

public void ChineseGreeting(string name){
Console.WriteLine("ÔçÉϺÃ, " + name);
}

Õâʱºò£¬GreetPeopleÒ²ÐèÒª¸ÄÒ»¸ÄÁË£¬²»È»ÈçºÎÅжϵ½µ×ÓÃÄĸö°æ±¾µÄGreetingÎʺò·½·¨ºÏÊÊÄØ£¿ÔÚ½øÐÐÕâ¸ö֮ǰ£¬ÎÒÃÇ×îºÃÔÙ¶¨ÒåÒ»¸öö¾Ù×÷ΪÅжϵÄÒÀ¾Ý£º

public enum Language{
English, Chinese
}

public void GreetPeople(string name, Language lang){
//×öijЩ¶îÍâµÄÊÂÇ飬±ÈÈç³õʼ»¯Ö®À࣬´Ë´¦ÂÔ
swith(lang){
case Language.English:
EnglishGreeting(name);
break;
case Language.Chinese:
ChineseGreeting(name);
break;
}
}

OK£¬¾¡¹ÜÕâÑù½â¾öÁËÎÊÌ⣬µ«ÎÒ²»Ëµ´ó¼ÒÒ²ºÜÈÝÒ×Ïëµ½£¬Õâ¸ö½â¾ö·½°¸µÄ¿ÉÀ©Õ¹ÐԺܲÈç¹ûÈÕºóÎÒÃÇÐèÒªÔÙÌí¼Óº«Îİ桢ÈÕÎİ棬¾Í²»µÃ²»·´¸´ÐÞ¸Äö¾ÙºÍGreetPeople()·½·¨£¬ÒÔÊÊӦеÄÐèÇó¡£

ÔÚ¿¼ÂÇеĽâ¾ö·½°¸Ö®Ç°£¬ÎÒÃÇÏÈ¿´¿´ GreetPeopleµÄ·½·¨Ç©Ãû£º

public void GreetPeople(string name, Language lang)

ÎÒÃǽö¿´ string name£¬ÔÚÕâÀstring ÊDzÎÊýÀàÐÍ£¬name ÊDzÎÊý±äÁ¿£¬µ±ÎÒÃǸ³¸øname×Ö·û´®¡°jimmy¡±Ê±£¬Ëü¾Í´ú±í¡°jimmy¡±Õâ¸öÖµ£»µ±ÎÒÃǸ³¸øËü¡°ÕÅ×ÓÑô¡±Ê±£¬ËüÓÖ´ú±í×Å¡°ÕÅ×ÓÑô¡±Õâ¸öÖµ¡£È»ºó£¬ÎÒÃÇ¿ÉÒÔÔÚ·½·¨ÌåÄÚ¶ÔÕâ¸öname½øÐÐÆäËû²Ù×÷¡£°¥£¬Õâ¼òÖ±ÊÇ·Ï»°Ã´£¬¸Õѧ³ÌÐò¾ÍÖªµÀÁË¡£

Èç¹ûÄãÔÙ×ÐϸÏëÏ룬¼ÙÈçGreetPeople()·½·¨¿ÉÒÔ½ÓÊÜÒ»¸ö²ÎÊý±äÁ¿£¬Õâ¸ö±äÁ¿¿ÉÒÔ´ú±íÁíÒ»¸ö·½·¨£¬µ±ÎÒÃǸøÕâ¸ö±äÁ¿¸³Öµ EnglishGreetingµÄʱºò£¬Ëü´ú±í×Å EnglsihGreeting() Õâ¸ö·½·¨£»µ±ÎÒÃǸøËü¸³ÖµChineseGreeting µÄʱºò£¬ËüÓÖ´ú±í×ÅChineseGreeting()·½·¨¡£ÎÒÃǽ«Õâ¸ö²ÎÊý±äÁ¿ÃüÃûΪ MakeGreeting£¬ÄÇô²»ÊÇ¿ÉÒÔÈçͬ¸øname¸³ÖµÊ±Ò»Ñù£¬ÔÚµ÷Óà GreetPeople()·½·¨µÄʱºò£¬¸øÕâ¸öMakeGreeting ²ÎÊýÒ²¸³ÉÏֵô(ChineseGreeting»òÕßEnglsihGreetingµÈ)£¿È»ºó£¬ÎÒÃÇÔÚ·½·¨ÌåÄÚ£¬Ò²¿ÉÒÔÏñʹÓñðµÄ²ÎÊýÒ»ÑùʹÓÃMakeGreeting¡£µ«ÊÇ£¬ÓÉÓÚMakeGreeting´ú±í×ÅÒ»¸ö·½·¨£¬ËüµÄʹÓ÷½Ê½Ó¦¸ÃºÍËü±»¸³µÄ·½·¨(±ÈÈçChineseGreeting)ÊÇÒ»ÑùµÄ£¬±ÈÈ磺

MakeGreeting(name);

ºÃÁË£¬ÓÐÁË˼·ÁË£¬ÎÒÃÇÏÖÔÚ¾ÍÀ´¸Ä¸ÄGreetPeople()·½·¨£¬ÄÇôËüÓ¦¸ÃÊÇÕâ¸öÑù×ÓÁË£º

public void GreetPeople(string name, *** MakeGreeting){
MakeGreeting(name);
}

×¢Òâµ½ *** £¬Õâ¸öλÖÃͨ³£·ÅÖõÄÓ¦¸ÃÊDzÎÊýµÄÀàÐÍ£¬µ«µ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃǽö½öÊÇÏëµ½Ó¦¸ÃÓиö¿ÉÒÔ´ú±í·½·¨µÄ²ÎÊý£¬²¢°´Õâ¸ö˼·ȥ¸ÄдGreetPeople·½·¨£¬ÏÖÔھͳöÏÖÁËÒ»¸ö´óÎÊÌ⣺Õâ¸ö´ú±í×Å·½·¨µÄMakeGreeting²ÎÊýÓ¦¸ÃÊÇʲôÀàÐ͵ģ¿

NOTE£ºÕâÀïÒѲ»ÔÙÐèҪö¾ÙÁË£¬ÒòΪÔÚ¸øMakeGreeting¸³ÖµµÄʱºò¶¯Ì¬µØ¾ö¶¨Ê¹ÓÃÄĸö·½·¨£¬ÊÇChineseGreeting»¹ÊÇ EnglishGreeting£¬¶øÔÚÕâ¸öÁ½¸ö·½·¨ÄÚ²¿£¬ÒѾ­¶ÔʹÓá°morning¡±»¹ÊÇ¡°ÔçÉϺá±×÷ÁËÇø·Ö¡£

´ÏÃ÷µÄÄãÓ¦¸ÃÒѾ­Ïëµ½ÁË£¬ÏÖÔÚÊÇίÍиóö³¡µÄʱºòÁË£¬µ«½²ÊöίÍÐ֮ǰ£¬ÎÒÃÇÔÙ¿´¿´MakeGreeting²ÎÊýËùÄÜ´ú±íµÄ ChineseGreeting()ºÍEnglishGreeting()·½·¨µÄÇ©Ãû£º

public void EnglishGreeting(string name)
public void ChineseGreeting(string name)

Èçͬname¿ÉÒÔ½ÓÊÜStringÀàÐ͵ġ°true¡±ºÍ¡°1¡±£¬µ«²»ÄܽÓÊÜboolÀàÐ͵ÄtrueºÍintÀàÐ͵Ä1Ò»Ñù¡£MakeGreetingµÄ ²ÎÊýÀàÐͶ¨Òå Ó¦¸ÃÄܹ»È·¶¨ MakeGreeting¿ÉÒÔ´ú±íµÄ·½·¨ÖÖÀ࣬ÔÙ½øÒ»²½½²£¬¾ÍÊÇMakeGreeting¿ÉÒÔ´ú±íµÄ·½·¨ µÄ ²ÎÊýÀàÐͺͷµ»ØÀàÐÍ¡£

ÓÚÊÇ£¬Î¯ÍгöÏÖÁË£ºËü¶¨ÒåÁËMakeGreeting²ÎÊýËùÄÜ´ú±íµÄ·½·¨µÄÖÖÀ࣬Ҳ¾ÍÊÇMakeGreeting²ÎÊýµÄÀàÐÍ¡£

NOTE£ºÈç¹ûÉÏÃæÕâ¾ä»°±È½ÏÈÆ¿Ú£¬ÎÒ°ÑËü·­Òë³ÉÕâÑù£ºstring ¶¨ÒåÁËname²ÎÊýËùÄÜ´ú±íµÄÖµµÄÖÖÀ࣬Ҳ¾ÍÊÇname²ÎÊýµÄÀàÐÍ¡£

±¾ÀýÖÐίÍе͍Ò壺

public delegate void GreetingDelegate(string name);

¿ÉÒÔÓëÉÏÃæEnglishGreeting()·½·¨µÄÇ©Ãû¶Ô±Èһϣ¬³ýÁ˼ÓÈëÁËdelegate¹Ø¼ü×ÖÒÔÍ⣬ÆäÓàµÄÊDz»ÊÇÍêȫһÑù£¿

ÏÖÔÚ£¬ÈÃÎÒÃÇÔٴθ͝GreetPeople()·½·¨£¬ÈçÏÂËùʾ£º

public void GreetPeople(string name, GreetingDelegate MakeGreeting){
MakeGreeting(name);
}

ÈçÄãËù¼û£¬Î¯ÍÐGreetingDelegate³öÏÖµÄλÖÃÓë stringÏàͬ£¬stringÊÇÒ»¸öÀàÐÍ£¬ÄÇôGreetingDelegateÓ¦¸ÃÒ²ÊÇÒ»¸öÀàÐÍ£¬»òÕß½ÐÀà(Class)¡£µ«ÊÇίÍеÄÉùÃ÷·½Ê½ºÍÀàÈ´ÍêÈ«²»Í¬£¬ÕâÊÇÔõôһ»ØÊ£¿Êµ¼ÊÉÏ£¬Î¯ÍÐÔÚ±àÒëµÄʱºòȷʵ»á±àÒë³ÉÀà¡£ÒòΪDelegateÊÇÒ»¸öÀ࣬ËùÒÔÔÚÈκοÉÒÔÉùÃ÷ÀàµÄµØ·½¶¼¿ÉÒÔÉùÃ÷ίÍС£¸ü¶àµÄÄÚÈݽ«ÔÚÏÂÃæ½²Êö£¬ÏÖÔÚ£¬Çë¿´¿´Õâ¸ö·¶ÀýµÄÍêÕû´úÂ룺

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate {
//¶¨ÒåίÍУ¬Ëü¶¨ÒåÁË¿ÉÒÔ´ú±íµÄ·½·¨µÄÀàÐÍ
public delegate void GreetingDelegate(string name);
class Program {

private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}

private static void ChineseGreeting(string name) {
Console.WriteLine("ÔçÉϺÃ, " + name);
}

//×¢Òâ´Ë·½·¨£¬Ëü½ÓÊÜÒ»¸öGreetingDelegateÀàÐ͵ķ½·¨×÷Ϊ²ÎÊý
private static void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}

static void Main(string[] args) {
GreetPeople("Jimmy Zhang", EnglishGreeting);
GreetPeople("ÕÅ×ÓÑô", ChineseGreeting);
Console.ReadKey();
}
}
}

Êä³öÈçÏ£º
Morning, Jimmy Zhang
ÔçÉϺÃ, ÕÅ×ÓÑô

ÎÒÃÇÏÖÔÚ¶ÔίÍÐ×öÒ»¸ö×ܽ᣺

ίÍÐÊÇÒ»¸öÀ࣬Ëü¶¨ÒåÁË·½·¨µÄÀàÐÍ£¬Ê¹µÃ¿ÉÒÔ½«·½·¨µ±×÷ÁíÒ»¸ö·½·¨µÄ²ÎÊýÀ´½øÐд«µÝ£¬ÕâÖÖ½«·½·¨¶¯Ì¬µØ¸³¸ø²ÎÊýµÄ×ö·¨£¬¿ÉÒÔ±ÜÃâÔÚ³ÌÐòÖдóÁ¿Ê¹ÓÃIf-Else(Switch)Óï¾ä£¬Í¬Ê±Ê¹µÃ³ÌÐò¾ßÓиüºÃµÄ¿ÉÀ©Õ¹ÐÔ¡£

½«·½·¨°ó¶¨µ½Î¯ÍÐ

¿´µ½ÕâÀÊDz»ÊÇÓÐÄÇôµãÈçÃγõÐѵĸоõ£¿ÓÚÊÇ£¬ÄãÊDz»ÊÇÔÚÏ룺ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒ²»Ò»¶¨ÒªÖ±½ÓÔÚGreetPeople()·½·¨Öиø name²ÎÊý¸³Öµ£¬ÎÒ¿ÉÒÔÏñÕâÑùʹÓñäÁ¿£º

static void Main(string[] args) {
string name1, name2;
name1 = "Jimmy Zhang";
name2 = "ÕÅ×ÓÑô";

GreetPeople(name1, EnglishGreeting);
GreetPeople(name2, ChineseGreeting);
Console.ReadKey();
}

¶ø¼ÈȻίÍÐGreetingDelegate ºÍ ÀàÐÍ string µÄµØÎ»Ò»Ñù£¬¶¼ÊǶ¨ÒåÁËÒ»ÖÖ²ÎÊýÀàÐÍ£¬ÄÇô£¬ÎÒÊDz»ÊÇÒ²¿ÉÒÔÕâôʹÓÃίÍУ¿

static void Main(string[] args) {
GreetingDelegate delegate1, delegate2;
delegate1 = EnglishGreeting;
delegate2 = ChineseGreeting;

GreetPeople("Jimmy Zhang", delegate1);
GreetPeople("ÕÅ×ÓÑô", delegate2);
Console.ReadKey();
}

ÈçÄãËùÁÏ£¬ÕâÑùÊÇûÓÐÎÊÌâµÄ£¬³ÌÐòÒ»ÈçÔ¤ÁϵÄÄÇÑùÊä³ö¡£ÕâÀÎÒÏë˵µÄÊÇίÍв»Í¬ÓÚstringµÄÒ»¸öÌØÐÔ£º¿ÉÒÔ½«¶à¸ö·½·¨¸³¸øÍ¬Ò»¸öίÍУ¬»òÕ߽н«¶à¸ö·½·¨°ó¶¨µ½Í¬Ò»¸öίÍУ¬µ±µ÷ÓÃÕâ¸öίÍеÄʱºò£¬½«ÒÀ´Îµ÷ÓÃÆäËù°ó¶¨µÄ·½·¨¡£ÔÚÕâ¸öÀý×ÓÖУ¬Óï·¨ÈçÏ£º

static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // ÏȸøÎ¯ÍÐÀàÐ͵ıäÁ¿¸³Öµ
delegate1 += ChineseGreeting; // ¸ø´ËίÍбäÁ¿ÔÙ°ó¶¨Ò»¸ö·½·¨

// ½«ÏȺóµ÷Óà EnglishGreeting Óë ChineseGreeting ·½·¨
GreetPeople("Jimmy Zhang", delegate1);
Console.ReadKey();
}

Êä³öΪ£º
Morning, Jimmy Zhang
ÔçÉϺÃ, Jimmy Zhang

ʵ¼ÊÉÏ£¬ÎÒÃÇ¿ÉÒÔÒ²¿ÉÒÔÈÆ¹ýGreetPeople·½·¨£¬Í¨¹ýίÍÐÀ´Ö±½Óµ÷ÓÃEnglishGreetingºÍChineseGreeting£º

static void Main(string[] args) {
GreetingDelegate delegate1;
delegate1 = EnglishGreeting; // ÏȸøÎ¯ÍÐÀàÐ͵ıäÁ¿¸³Öµ
delegate1 += ChineseGreeting; // ¸ø´ËίÍбäÁ¿ÔÙ°ó¶¨Ò»¸ö·½·¨

// ½«ÏȺóµ÷Óà EnglishGreeting Óë ChineseGreeting ·½·¨
delegate1 ("Jimmy Zhang");
Console.ReadKey();
}

NOTE£ºÕâÔÚ±¾ÀýÖÐÊÇûÓÐÎÊÌâµÄ£¬µ«»ØÍ·¿´ÏÂÉÏÃæGreetPeople()µÄ¶¨Ò壬ÔÚËüÖ®ÖпÉÒÔ×öһЩ¶ÔÓÚEnglshihGreetingºÍChineseGreetingÀ´Ëµ¶¼ÐèÒª½øÐеŤ×÷£¬ÎªÁ˼ò±ãÎÒ×öÁËÊ¡ÂÔ¡£

×¢ÒâÕâÀµÚÒ»´ÎÓõġ°=¡±£¬ÊǸ³ÖµµÄÓï·¨£»µÚ¶þ´Î£¬ÓõÄÊÇ¡°+=¡±£¬Êǰ󶨵ÄÓï·¨¡£Èç¹ûµÚÒ»´Î¾ÍʹÓá°+=¡±£¬½«³öÏÖ¡°Ê¹ÓÃÁËδ¸³ÖµµÄ¾Ö²¿±äÁ¿¡±µÄ±àÒë´íÎó¡£

ÎÒÃÇÒ²¿ÉÒÔʹÓÃÏÂÃæµÄ´úÂëÀ´ÕâÑù¼ò»¯ÕâÒ»¹ý³Ì£º

GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // ¸ø´ËίÍбäÁ¿ÔÙ°ó¶¨Ò»¸ö·½·¨

¿´µ½ÕâÀӦ¸Ã×¢Òâµ½£¬Õâ¶Î´úÂëµÚÒ»ÌõÓï¾äÓëʵÀý»¯Ò»¸öÀàÊÇºÎÆäµÄÏàËÆ£¬Äã²»½ûÏëµ½£ºÉÏÃæµÚÒ»´Î°ó¶¨Î¯ÍÐʱ²»¿ÉÒÔʹÓá°+=¡±µÄ±àÒë´íÎ󣬻òÐí¿ÉÒÔÓÃÕâÑùµÄ·½·¨À´±ÜÃ⣺

GreetingDelegate delegate1 = new GreetingDelegate();
delegate1 += EnglishGreeting; // Õâ´ÎÓõÄÊÇ ¡°+=¡±£¬°ó¶¨Óï·¨¡£
delegate1 += ChineseGreeting; // ¸ø´ËίÍбäÁ¿ÔÙ°ó¶¨Ò»¸ö·½·¨

µ«Êµ¼ÊÉÏ£¬ÕâÑù»á³öÏÖ±àÒë´íÎó£º ¡°GreetingDelegate¡±·½·¨Ã»ÓвÉÓá°0¡±¸ö²ÎÊýµÄÖØÔØ¡£¾¡¹ÜÕâÑùµÄ½á¹ûÈÃÎÒÃǾõµÃÓеã¾ÚÉ¥£¬µ«ÊDZàÒëµÄÌáʾ£º¡°Ã»ÓÐ0¸ö²ÎÊýµÄÖØÔØ¡±ÔÙ´ÎÈÃÎÒÃÇÁªÏëµ½ÁËÀàµÄ¹¹Ô캯Êý¡£ÎÒÖªµÀÄãÒ»¶¨°´Þ಻סÏë̽¸ö¾¿¾¹£¬µ«ÔÙ´Ë֮ǰ£¬ÎÒÃÇÐèÒªÏȰѻù´¡ÖªÊ¶ºÍÓ¦ÓýéÉÜÍê¡£

¼ÈÈ»¸øÎ¯ÍпÉÒÔ°ó¶¨Ò»¸ö·½·¨£¬ÄÇôҲӦ¸ÃÓа취ȡÏû¶Ô·½·¨µÄ°ó¶¨£¬ºÜÈÝÒ×Ïëµ½£¬Õâ¸öÓï·¨ÊÇ¡°-=¡±£º

static void Main(string[] args) {
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
delegate1 += ChineseGreeting; // ¸ø´ËίÍбäÁ¿ÔÙ°ó¶¨Ò»¸ö·½·¨

// ½«ÏȺóµ÷Óà EnglishGreeting Óë ChineseGreeting ·½·¨
GreetPeople("Jimmy Zhang", delegate1);
Console.WriteLine();

delegate1 -= EnglishGreeting; //È¡Ïû¶ÔEnglishGreeting·½·¨µÄ°ó¶¨
// ½«½öµ÷Óà ChineseGreeting
GreetPeople("ÕÅ×ÓÑô", delegate1);
Console.ReadKey();
}
Êä³öΪ£º
Morning, Jimmy Zhang
ÔçÉϺÃ, Jimmy Zhang
ÔçÉϺÃ, ÕÅ×ÓÑô

ÈÃÎÒÃÇÔٴζÔίÍÐ×÷¸ö×ܽ᣺

ʹÓÃίÍпÉÒÔ½«¶à¸ö·½·¨°ó¶¨µ½Í¬Ò»¸öίÍбäÁ¿£¬µ±µ÷Óô˱äÁ¿Ê±(ÕâÀïÓá°µ÷Óá±Õâ¸ö´Ê£¬ÊÇÒòΪ´Ë±äÁ¿´ú±íÒ»¸ö·½·¨)£¬¿ÉÒÔÒÀ´Îµ÷ÓÃËùÓа󶨵ķ½·¨¡£

ʼþµÄÓÉÀ´

ÎÒÃǼÌÐøË¼¿¼ÉÏÃæµÄ³ÌÐò£ºÉÏÃæµÄÈý¸ö·½·¨¶¼¶¨ÒåÔÚProgrameÀàÖУ¬ÕâÑù×öÊÇΪÁËÀí½âµÄ·½±ã£¬Êµ¼ÊÓ¦ÓÃÖУ¬Í¨³£¶¼ÊÇ GreetPeople ÔÚÒ»¸öÀàÖУ¬ChineseGreetingºÍ EnglishGreeting ÔÚÁíÍâµÄÀàÖС£ÏÖÔÚÄãÒѾ­¶ÔίÍÐÓÐÁ˳õ²½Á˽⣬ÊÇʱºò¶ÔÉÏÃæµÄÀý×Ó×ö¸ö¸Ä½øÁË¡£¼ÙÉèÎÒÃǽ«GreetingPeople()·ÅÔÚÒ»¸ö½ÐGreetingManagerµÄÀàÖУ¬ÄÇôгÌÐòÓ¦¸ÃÊÇÕâ¸öÑù×ӵģº

namespace Delegate {
//¶¨ÒåίÍУ¬Ëü¶¨ÒåÁË¿ÉÒÔ´ú±íµÄ·½·¨µÄÀàÐÍ
public delegate void GreetingDelegate(string name);

//н¨µÄGreetingManagerÀà
public class GreetingManager{
public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
}

class Program {
private static void EnglishGreeting(string name) {
Console.WriteLine("Morning, " + name);
}

private static void ChineseGreeting(string name) {
Console.WriteLine("ÔçÉϺÃ, " + name);
}

static void Main(string[] args) {
// ... ...
}
}
}

Õâ¸öʱºò£¬Èç¹ûҪʵÏÖÇ°ÃæÑÝʾµÄÊä³öЧ¹û£¬Main·½·¨ÎÒÏëÓ¦¸ÃÊÇÕâÑùµÄ£º

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
gm.GreetPeople("Jimmy Zhang", EnglishGreeting);
gm.GreetPeople("ÕÅ×ÓÑô", ChineseGreeting);
}

ÎÒÃÇÔËÐÐÕâ¶Î´úÂ룬àÅ£¬Ã»ÓÐÈκÎÎÊÌâ¡£³ÌÐòÒ»ÈçÔ¤ÁϵØÄÇÑùÊä³öÁË£º

Morning, Jimmy Zhang

ÔçÉϺÃ, ÕÅ×ÓÑô

ÏÖÔÚ£¬¼ÙÉèÎÒÃÇÐèҪʹÓÃÉÏÒ»½Úѧµ½µÄ֪ʶ£¬½«¶à¸ö·½·¨°ó¶¨µ½Í¬Ò»¸öίÍбäÁ¿£¬¸ÃÈçºÎ×öÄØ£¿ÈÃÎÒÃÇÔٴθÄд´úÂ룺

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
GreetingDelegate delegate1;
delegate1 = EnglishGreeting;
delegate1 += ChineseGreeting;

gm.GreetPeople("Jimmy Zhang", delegate1);
}

Êä³ö£º
Morning, Jimmy Zhang
ÔçÉϺÃ, Jimmy Zhang

µ½ÁËÕâÀÎÒÃDz»½ûÏëµ½£ºÃæÏò¶ÔÏóÉè¼Æ£¬½²¾¿µÄÊǶÔÏóµÄ·â×°£¬¼ÈÈ»¿ÉÒÔÉùÃ÷ίÍÐÀàÐ͵ıäÁ¿(ÔÚÉÏÀýÖÐÊÇdelegate1)£¬ÎÒÃǺβ»½«Õâ¸ö±äÁ¿·â×°µ½ GreetManagerÀàÖУ¿ÔÚÕâ¸öÀàµÄ¿Í»§¶ËÖÐʹÓò»ÊǸü·½±ãô£¿ÓÚÊÇ£¬ÎÒÃǸÄдGreetManagerÀ࣬ÏñÕâÑù£º

public class GreetingManager{
//ÔÚGreetingManagerÀàµÄÄÚ²¿ÉùÃ÷delegate1±äÁ¿
public GreetingDelegate delegate1;

public void GreetPeople(string name, GreetingDelegate MakeGreeting) {
MakeGreeting(name);
}
}

ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔÕâÑùʹÓÃÕâ¸öίÍбäÁ¿£º

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
gm.delegate1 = EnglishGreeting;
gm.delegate1 += ChineseGreeting;

gm.GreetPeople("Jimmy Zhang", gm.delegate1);
}

Êä³öΪ£º
Morning, Jimmy Zhang
ÔçÉϺÃ, Jimmy Zhang

¾¡¹ÜÕâÑù×öûÓÐÈκÎÎÊÌ⣬µ«ÎÒÃÇ·¢ÏÖÕâÌõÓï¾äºÜÆæ¹Ö¡£ÔÚµ÷ÓÃgm.GreetPeople·½·¨µÄʱºò£¬Ôٴδ«µÝÁËgmµÄdelegate1×ֶΣº

gm.GreetPeople("Jimmy Zhang", gm.delegate1);

¼ÈÈ»Èç´Ë£¬ÎÒÃǺβ»ÐÞ¸Ä GreetingManager Àà³ÉÕâÑù£º

public class GreetingManager{
//ÔÚGreetingManagerÀàµÄÄÚ²¿ÉùÃ÷delegate1±äÁ¿
public GreetingDelegate delegate1;

public void GreetPeople(string name) {
if(delegate1!=null){ //Èç¹ûÓз½·¨×¢²áίÍбäÁ¿
delegate1(name); //ͨ¹ýίÍе÷Ó÷½·¨
}
}
}

ÔÚ¿Í»§¶Ë£¬µ÷Óÿ´ÉÏÈ¥¸ü¼ò½àһЩ£º

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
gm.delegate1 = EnglishGreeting;
gm.delegate1 += ChineseGreeting;

gm.GreetPeople("Jimmy Zhang"); //×¢Ò⣬Õâ´Î²»ÐèÒªÔÙ´«µÝ delegate1±äÁ¿
}

Êä³öΪ£º
Morning, Jimmy Zhang
ÔçÉϺÃ, Jimmy Zhang

¾¡¹ÜÕâÑù´ïµ½ÁËÎÒÃÇÒªµÄЧ¹û£¬µ«ÊÇ»¹ÊÇ´æÔÚ×ÅÎÊÌ⣺

ÔÚÕâÀdelegate1ºÍÎÒÃÇÆ½Ê±ÓõÄstringÀàÐ͵ıäÁ¿Ã»ÓÐʲô·Ö±ð£¬¶øÎÒÃÇÖªµÀ£¬²¢²»ÊÇËùÓеÄ×ֶζ¼Ó¦¸ÃÉùÃ÷³Épublic£¬ºÏÊʵÄ×ö·¨ÊÇÓ¦¸ÃpublicµÄʱºòpublic£¬Ó¦¸ÃprivateµÄʱºòprivate¡£

ÎÒÃÇÏÈ¿´¿´Èç¹û°Ñ delegate1 ÉùÃ÷Ϊ private»áÔõÑù£¿½á¹û¾ÍÊÇ£ºÕâ¼òÖ±¾ÍÊÇÔÚ¸ãЦ¡£ÒòΪÉùÃ÷ίÍеÄÄ¿µÄ¾ÍÊÇΪÁ˰ÑËü±©Â¶ÔÚÀàµÄ¿Í»§¶Ë½øÐз½·¨µÄ×¢²á£¬Äã°ÑËüÉùÃ÷ΪprivateÁË£¬¿Í»§¶Ë¶ÔËü¸ù±¾¾Í²»¿É¼û£¬ÄÇËü»¹ÓÐʲôÓã¿

ÔÙ¿´¿´°Ñdelegate1 ÉùÃ÷Ϊ public »áÔõÑù£¿½á¹û¾ÍÊÇ£ºÔÚ¿Í»§¶Ë¿ÉÒÔ¶ÔËü½øÐÐËæÒâµÄ¸³ÖµµÈ²Ù×÷£¬ÑÏÖØÆÆ»µ¶ÔÏóµÄ·â×°ÐÔ¡£

×îºó£¬µÚÒ»¸ö·½·¨×¢²áÓá°=¡±£¬ÊǸ³ÖµÓï·¨£¬ÒòΪҪ½øÐÐʵÀý»¯£¬µÚ¶þ¸ö·½·¨×¢²áÔòÓõÄÊÇ¡°+=¡±¡£µ«ÊÇ£¬²»¹ÜÊǸ³Öµ»¹ÊÇ×¢²á£¬¶¼Êǽ«·½·¨°ó¶¨µ½Î¯ÍÐÉÏ£¬³ýÁ˵÷ÓÃʱÏȺó˳Ðò²»Í¬£¬ÔÙûÓÐÈκεķֱð£¬ÕâÑù²»ÊÇÈÃÈ˾õµÃºÜ±ðŤô£¿

ÏÖÔÚÎÒÃÇÏëÏ룬Èç¹ûdelegate1²»ÊÇÒ»¸öίÍÐÀàÐÍ£¬¶øÊÇÒ»¸östringÀàÐÍ£¬Äã»áÔõô×ö£¿´ð°¸ÊÇʹÓÃÊôÐÔ¶Ô×ֶνøÐзâ×°¡£

ÓÚÊÇ£¬Event³ö³¡ÁË£¬Ëü·â×°ÁËίÍÐÀàÐ͵ıäÁ¿£¬Ê¹µÃ£ºÔÚÀàµÄÄÚ²¿£¬²»¹ÜÄãÉùÃ÷ËüÊÇpublic»¹ÊÇprotected£¬Ëü×ÜÊÇprivateµÄ¡£ÔÚÀàµÄÍⲿ£¬×¢²á¡°+=¡±ºÍ×¢Ïú¡°-=¡±µÄ·ÃÎÊÏÞ¶¨·ûÓëÄãÔÚÉùÃ÷ʼþʱʹÓõķÃÎÊ·ûÏàͬ¡£

ÎÒÃǸÄдGreetingManagerÀ࣬Ëü±ä³ÉÁËÕâ¸öÑù×Ó£º

public class GreetingManager{
//ÕâÒ»´ÎÎÒÃÇÔÚÕâÀïÉùÃ÷Ò»¸öʼþ
public event GreetingDelegate MakeGreet;

public void GreetPeople(string name) {
MakeGreet(name);
}
}

ºÜÈÝÒ××¢Òâµ½£ºMakeGreet ʼþµÄÉùÃ÷Óë֮ǰίÍбäÁ¿delegate1µÄÉùÃ÷ΨһµÄÇø±ðÊǶàÁËÒ»¸öevent¹Ø¼ü×Ö¡£¿´µ½ÕâÀÔÚ½áºÏÉÏÃæµÄ½²½â£¬ÄãÓ¦¸ÃÃ÷°×µ½£ºÊ¼þÆäʵûʲô²»ºÃÀí½âµÄ£¬ÉùÃ÷Ò»¸öʼþ²»¹ýÀàËÆÓÚÉùÃ÷Ò»¸ö½øÐÐÁË·â×°µÄίÍÐÀàÐ͵ıäÁ¿¶øÒÑ¡£

ΪÁËÖ¤Ã÷ÉÏÃæµÄÍÆÂÛ£¬Èç¹ûÎÒÃÇÏñÏÂÃæÕâÑù¸ÄдMain·½·¨£º

static void Main(string[] args) {
GreetingManager gm = new GreetingManager();
gm.MakeGreet = EnglishGreeting; // ±àÒë´íÎó1
gm.MakeGreet += ChineseGreeting;

gm.GreetPeople("Jimmy Zhang");
}

»áµÃµ½±àÒë´íÎó£ºÊ¼þ¡°Delegate.GreetingManager.MakeGreet¡±Ö»ÄܳöÏÖÔÚ += »ò -= µÄ×ó±ß(´ÓÀàÐÍ¡°Delegate.GreetingManager¡±ÖÐʹÓÃʱ³ýÍâ)¡£

ʼþºÍίÍеıàÒë´úÂë

Õâʱºò£¬ÎÒÃÇ×¢Ê͵ô±àÒë´íÎóµÄÐУ¬È»ºóÖØÐ½øÐбàÒ룬ÔÙ½èÖúReflactorÀ´¶Ô eventµÄÉùÃ÷Óï¾ä×öһ̽¾¿£¬¿´¿´ÎªÊ²Ã´»á·¢ÉúÕâÑùµÄ´íÎó£º

public event GreetingDelegate MakeGreet;

¿ÉÒÔ¿´µ½£¬Êµ¼ÊÉϾ¡¹ÜÎÒÃÇÔÚGreetingManagerÀォ MakeGreet ÉùÃ÷Ϊpublic£¬µ«ÊÇ£¬Êµ¼ÊÉÏMakeGreet»á±»±àÒë³É ˽ÓÐ×ֶΣ¬ÄѹֻᷢÉúÉÏÃæµÄ±àÒë´íÎóÁË£¬ÒòΪËü¸ù±¾¾Í²»ÔÊÐíÔÚGreetingManagerÀàµÄÍâÃæÒÔ¸³ÖµµÄ·½Ê½·ÃÎÊ£¬´Ó¶øÑéÖ¤ÁËÎÒÃÇÉÏÃæËù×öµÄÍÆÂÛ¡£

ÎÒÃÇÔÙ½øÒ»²½¿´ÏÂMakeGreetËù²úÉúµÄ´úÂ룺

private GreetingDelegate MakeGreet; //¶ÔʼþµÄÉùÃ÷ ʵ¼ÊÊÇ ÉùÃ÷Ò»¸ö˽ÓеÄίÍбäÁ¿

[MethodImpl(MethodImplOptions.Synchronized)]
public void add_MakeGreet(GreetingDelegate value){
this.MakeGreet = (GreetingDelegate) Delegate.Combine(this.MakeGreet, value);
}

[MethodImpl(MethodImplOptions.Synchronized)]
public void remove_MakeGreet(GreetingDelegate value){
this.MakeGreet = (GreetingDelegate) Delegate.Remove(this.MakeGreet, value);
}

ÏÖÔÚÒѾ­ºÜÃ÷È·ÁË£ºMakeGreetʼþȷʵÊÇÒ»¸öGreetingDelegateÀàÐ͵ÄίÍУ¬Ö»²»¹ý²»¹ÜÊDz»ÊÇÉùÃ÷Ϊpublic£¬Ëü×ÜÊDZ»ÉùÃ÷Ϊprivate¡£ÁíÍ⣬Ëü»¹ÓÐÁ½¸ö·½·¨£¬·Ö±ðÊÇadd_MakeGreetºÍremove_MakeGreet£¬ÕâÁ½¸ö·½·¨·Ö±ðÓÃÓÚ×¢²áίÍÐÀàÐ͵ķ½·¨ºÍÈ¡Ïû×¢²á¡£Êµ¼ÊÉÏÒ²¾ÍÊÇ£º ¡°+= ¡±¶ÔÓ¦ add_MakeGreet£¬¡°-=¡±¶ÔÓ¦remove_MakeGreet¡£¶øÕâÁ½¸ö·½·¨µÄ·ÃÎÊÏÞÖÆÈ¡¾öÓÚÉùÃ÷ʼþʱµÄ·ÃÎÊÏÞÖÆ·û¡£

ÔÚadd_MakeGreet()·½·¨ÄÚ²¿£¬Êµ¼ÊÉϵ÷ÓÃÁËSystem.DelegateµÄCombine()¾²Ì¬·½·¨£¬Õâ¸ö·½·¨ÓÃÓÚ½«µ±Ç°µÄ±äÁ¿Ìí¼Óµ½Î¯ÍÐÁ´±íÖС£ÎÒÃÇÇ°ÃæÌáµ½¹ýÁ½´Î£¬ËµÎ¯ÍÐʵ¼ÊÉÏÊÇÒ»¸öÀ࣬ÔÚÎÒÃǶ¨ÒåίÍеÄʱºò£º

public delegate void GreetingDelegate(string name);

µ±±àÒëÆ÷Óöµ½Õâ¶Î´úÂëµÄʱºò£¬»áÉú³ÉÏÂÃæÕâÑùÒ»¸öÍêÕûµÄÀࣺ

public sealed class GreetingDelegate:System.MulticastDelegate{
public GreetingDelegate(object @object, IntPtr method);
public virtual IAsyncResult BeginInvoke(string name, AsyncCallback callback, object @object);
public virtual void EndInvoke(IAsyncResult result);
public virtual void Invoke(string name);
}

¹ØÓÚÕâ¸öÀàµÄ¸üÉîÈëÄÚÈÝ£¬¿ÉÒÔ²ÎÔÄ¡¶CLR Via C#¡·µÈÏà¹ØÊé¼®£¬ÕâÀï¾Í²»ÔÙÌÖÂÛÁË¡£

ίÍС¢Ê¼þÓëObserverÉè¼ÆÄ£Ê½

·¶Àý˵Ã÷

ÉÏÃæµÄÀý×ÓÒѲ»×ãÒÔÔÙ½øÐÐÏÂÃæµÄ½²½âÁË£¬ÎÒÃÇÀ´¿´Ò»¸öеķ¶Àý£¬ÒòΪ֮ǰÒѾ­½éÉÜÁ˺ܶàµÄÄÚÈÝ£¬ËùÒÔ±¾½ÚµÄ½ø¶È»áÉÔ΢¿ìһЩ£º

¼ÙÉèÎÒÃÇÓиö¸ßµµµÄÈÈË®Æ÷£¬ÎÒÃǸøËüͨÉϵ磬µ±Ë®Î³¬¹ý95¶ÈµÄʱºò£º1¡¢ÑïÉùÆ÷»á¿ªÊ¼·¢³öÓïÒô£¬¸æËßÄãË®µÄζȣ»2¡¢Òº¾§ÆÁÒ²»á¸Ä±äˮεÄÏÔʾ£¬À´ÌáʾˮÒѾ­¿ìÉÕ¿ªÁË¡£

ÏÖÔÚÎÒÃÇÐèҪд¸ö³ÌÐòÀ´Ä£ÄâÕâ¸öÉÕË®µÄ¹ý³Ì£¬ÎÒÃǽ«¶¨ÒåÒ»¸öÀàÀ´´ú±íÈÈË®Æ÷£¬ÎÒÃǹÜËü½Ð£ºHeater£¬ËüÓдú±íˮεÄ×ֶΣ¬½Ð×ötemperature£»µ±È»£¬»¹Óбز»¿ÉÉٵĸøË®¼ÓÈÈ·½·¨BoilWater()£¬Ò»¸ö·¢³öÓïÒô¾¯±¨µÄ·½·¨MakeAlert()£¬Ò»¸öÏÔʾˮÎµķ½·¨£¬ShowMsg()¡£

namespace Delegate {
class Heater {
private int temperature; // Ë®ÎÂ
// ÉÕË®
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;

if (temperature > 95) {
MakeAlert(temperature);
ShowMsg(temperature);
}
}
}

// ·¢³öÓïÒô¾¯±¨
private void MakeAlert(int param) {
Console.WriteLine("Alarm£ºàÖàÖàÖ£¬Ë®ÒѾ­ {0} ¶ÈÁË£º" , param);
}

// ÏÔʾˮÎÂ
private void ShowMsg(int param) {
Console.WriteLine("Display£ºË®¿ì¿ªÁË£¬µ±Ç°Î¶ȣº{0}¶È¡£" , param);
}
}

class Program {
static void Main() {
Heater ht = new Heater();
ht.BoilWater();
}
}
}

ObserverÉè¼ÆÄ£Ê½¼ò½é

ÉÏÃæµÄÀý×ÓÏÔÈ»ÄÜÍê³ÉÎÒÃÇ֮ǰÃèÊöµÄ¹¤×÷£¬µ«ÊÇÈ´²¢²»¹»ºÃ¡£ÏÖÔÚ¼ÙÉèÈÈË®Æ÷ÓÉÈý²¿·Ö×é³É£ºÈÈË®Æ÷¡¢¾¯±¨Æ÷¡¢ÏÔʾÆ÷£¬ËüÃÇÀ´×ÔÓÚ²»Í¬³§É̲¢½øÐÐÁË×é×°¡£ÄÇô£¬Ó¦¸ÃÊÇÈÈË®Æ÷½ö½ö¸ºÔðÉÕË®£¬Ëü²»ÄÜ·¢³ö¾¯±¨Ò²²»ÄÜÏÔʾˮΣ»ÔÚË®ÉÕ¿ªÊ±Óɾ¯±¨Æ÷·¢³ö¾¯±¨¡¢ÏÔʾÆ÷ÏÔʾÌáʾºÍˮΡ£

Õâʱºò£¬ÉÏÃæµÄÀý×Ó¾ÍÓ¦¸Ã±ä³ÉÕâ¸öÑù×Ó£º

// ÈÈË®Æ÷
public class Heater {
private int temperature;

// ÉÕË®
private void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
}
}
}

// ¾¯±¨Æ÷
public class Alarm{
private void MakeAlert(int param) {
Console.WriteLine("Alarm£ºàÖàÖàÖ£¬Ë®ÒѾ­ {0} ¶ÈÁË£º" , param);
}
}

// ÏÔʾÆ÷
public class Display{
private void ShowMsg(int param) {
Console.WriteLine("Display£ºË®ÒÑÉÕ¿ª£¬µ±Ç°Î¶ȣº{0}¶È¡£" , param);
}
}

ÕâÀï¾Í³öÏÖÁËÒ»¸öÎÊÌ⣺ÈçºÎÔÚË®ÉÕ¿ªµÄʱºò֪ͨ±¨¾¯Æ÷ºÍÏÔʾÆ÷£¿ÔÚ¼ÌÐø½øÐÐ֮ǰ£¬ÎÒÃÇÏÈÁ˽âÒ»ÏÂObserverÉè¼ÆÄ£Ê½£¬ObserverÉè¼ÆÄ£Ê½ÖÐÖ÷Òª°üÀ¨ÈçÏÂÁ½Àà¶ÔÏó£º

Subject£º¼àÊÓ¶ÔÏó£¬ËüÍùÍù°üº¬×ÅÆäËû¶ÔÏóËù¸ÐÐËȤµÄÄÚÈÝ¡£ÔÚ±¾·¶ÀýÖУ¬ÈÈË®Æ÷¾ÍÊÇÒ»¸ö¼àÊÓ¶ÔÏó£¬Ëü°üº¬µÄÆäËû¶ÔÏóËù¸ÐÐËȤµÄÄÚÈÝ£¬¾ÍÊÇtemprature×ֶΣ¬µ±Õâ¸ö×ֶεÄÖµ¿ìµ½100ʱ£¬»á²»¶Ï°ÑÊý¾Ý·¢¸ø¼àÊÓËüµÄ¶ÔÏó¡£

Observer£º¼àÊÓÕߣ¬Ëü¼àÊÓSubject£¬µ±SubjectÖеÄij¼þÊ·¢ÉúµÄʱºò£¬»á¸æÖªObserver£¬¶øObserverÔò»á²ÉÈ¡ÏàÓ¦µÄÐж¯¡£ÔÚ±¾·¶ÀýÖУ¬ObserverÓо¯±¨Æ÷ºÍÏÔʾÆ÷£¬ËüÃDzÉÈ¡µÄÐж¯·Ö±ðÊÇ·¢³ö¾¯±¨ºÍÏÔʾˮΡ£

ÔÚ±¾ÀýÖУ¬ÊÂÇé·¢ÉúµÄ˳ÐòÓ¦¸ÃÊÇÕâÑùµÄ£º

¾¯±¨Æ÷ºÍÏÔʾÆ÷¸æËßÈÈË®Æ÷£¬Ëü¶ÔËüµÄζȱȽϸÐÐËȤ(×¢²á)¡£

ÈÈË®Æ÷ÖªµÀºó±£Áô¶Ô¾¯±¨Æ÷ºÍÏÔʾÆ÷µÄÒýÓá£

ÈÈË®Æ÷½øÐÐÉÕË®ÕâÒ»¶¯×÷£¬µ±Ë®Î³¬¹ý95¶Èʱ£¬Í¨¹ý¶Ô¾¯±¨Æ÷ºÍÏÔʾÆ÷µÄÒýÓã¬×Ô¶¯µ÷Óþ¯±¨Æ÷µÄMakeAlert()·½·¨¡¢ÏÔʾÆ÷µÄShowMsg()·½·¨¡£

ÀàËÆÕâÑùµÄÀý×ÓÊǺܶàµÄ£¬GOF¶ÔËü½øÐÐÁ˳éÏ󣬳ÆÎªObserverÉè¼ÆÄ£Ê½£ºObserverÉè¼ÆÄ£Ê½ÊÇΪÁ˶¨Òå¶ÔÏó¼äµÄÒ»ÖÖÒ»¶Ô¶àµÄÒÀÀµ¹ØÏµ£¬ÒÔ±ãÓÚµ±Ò»¸ö¶ÔÏóµÄ״̬¸Ä±äʱ£¬ÆäËûÒÀÀµÓÚËüµÄ¶ÔÏó»á±»×Ô¶¯¸æÖª²¢¸üС£ObserverģʽÊÇÒ»ÖÖËÉñîºÏµÄÉè¼ÆÄ£Ê½¡£

ʵÏÖ·¶ÀýµÄObserverÉè¼ÆÄ£Ê½

ÎÒÃÇ֮ǰÒѾ­¶ÔίÍкÍʼþ½éÉܺܶàÁË£¬ÏÖÔÚд´úÂëÓ¦¸ÃºÜÈÝÒ×ÁË£¬ÏÖÔÚÔÚÕâÀïÖ±½Ó¸ø³ö´úÂ룬²¢ÔÚ×¢ÊÍÖмÓÒÔ˵Ã÷¡£

using System;
using System.Collections.Generic;
using System.Text;

namespace Delegate {
// ÈÈË®Æ÷
public class Heater {
private int temperature;
public delegate void BoilHandler(int param); //ÉùÃ÷ίÍÐ
public event BoilHandler BoilEvent; //ÉùÃ÷ʼþ

// ÉÕË®
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;

if (temperature > 95) {
if (BoilEvent != null) { //Èç¹ûÓжÔÏó×¢²á
BoilEvent(temperature); //µ÷ÓÃËùÓÐ×¢²á¶ÔÏóµÄ·½·¨
}
}
}
}
}

// ¾¯±¨Æ÷
public class Alarm {
public void MakeAlert(int param) {
Console.WriteLine("Alarm£ºàÖàÖàÖ£¬Ë®ÒѾ­ {0} ¶ÈÁË£º", param);
}
}

// ÏÔʾÆ÷
public class Display {
public static void ShowMsg(int param) { //¾²Ì¬·½·¨
Console.WriteLine("Display£ºË®¿ìÉÕ¿ªÁË£¬µ±Ç°Î¶ȣº{0}¶È¡£", param);
}
}

class Program {
static void Main() {
Heater heater = new Heater();
Alarm alarm = new Alarm();

heater.BoilEvent += alarm.MakeAlert; //×¢²á·½·¨
heater.BoilEvent += (new Alarm()).MakeAlert; //¸øÄäÃû¶ÔÏó×¢²á·½·¨
heater.BoilEvent += Display.ShowMsg; //×¢²á¾²Ì¬·½·¨

heater.BoilWater(); //ÉÕË®£¬»á×Ô¶¯µ÷ÓÃ×¢²á¹ý¶ÔÏóµÄ·½·¨
}
}
}

Êä³öΪ£º
Alarm£ºàÖàÖàÖ£¬Ë®ÒѾ­ 96 ¶ÈÁË£º
Alarm£ºàÖàÖàÖ£¬Ë®ÒѾ­ 96 ¶ÈÁË£º
Display£ºË®¿ìÉÕ¿ªÁË£¬µ±Ç°Î¶ȣº96¶È¡£
// Ê¡ÂÔ...

.Net FrameworkÖеÄίÍÐÓëʼþ

¾¡¹ÜÉÏÃæµÄ·¶ÀýºÜºÃµØÍê³ÉÁËÎÒÃÇÏëÒªÍê³ÉµÄ¹¤×÷£¬µ«ÊÇÎÒÃDz»½öÒÉ»ó£ºÎªÊ²Ã´.Net Framework ÖеÄʼþÄ£ÐͺÍÉÏÃæµÄ²»Í¬£¿ÎªÊ²Ã´ÓкܶàµÄEventArgs²ÎÊý£¿

ÔڻشðÉÏÃæµÄÎÊÌâ֮ǰ£¬ÎÒÃÇÏȸ㶮 .Net FrameworkµÄ±àÂë¹æ·¶£º

ίÍÐÀàÐ͵ÄÃû³Æ¶¼Ó¦¸ÃÒÔEventHandler½áÊø¡£

ίÍеÄÔ­ÐͶ¨Ò壺ÓÐÒ»¸övoid·µ»ØÖµ£¬²¢½ÓÊÜÁ½¸öÊäÈë²ÎÊý£ºÒ»¸öObject ÀàÐÍ£¬Ò»¸ö EventArgsÀàÐÍ(»ò¼Ì³Ð×ÔEventArgs)¡£

ʼþµÄÃüÃûΪ ίÍÐÈ¥µô EventHandlerÖ®ºóÊ£ÓàµÄ²¿·Ö¡£

¼Ì³Ð×ÔEventArgsµÄÀàÐÍÓ¦¸ÃÒÔEventArgs½áβ¡£

ÔÙ×öÒ»ÏÂ˵Ã÷£º

ίÍÐÉùÃ÷Ô­ÐÍÖеÄObjectÀàÐ͵IJÎÊý´ú±íÁËSubject£¬Ò²¾ÍÊǼàÊÓ¶ÔÏó£¬ÔÚ±¾ÀýÖÐÊÇ Heater(ÈÈË®Æ÷)¡£»Øµ÷º¯Êý(±ÈÈçAlarmµÄMakeAlert)¿ÉÒÔͨ¹ýËü·ÃÎÊ´¥·¢Ê¼þµÄ¶ÔÏó(Heater)¡£

EventArgs ¶ÔÏó°üº¬ÁËObserverËù¸ÐÐËȤµÄÊý¾Ý£¬ÔÚ±¾ÀýÖÐÊÇtemperature¡£

ÉÏÃæÕâЩÆäʵ²»½ö½öÊÇΪÁ˱àÂë¹æ·¶¶øÒÑ£¬ÕâÑùҲʹµÃ³ÌÐòÓиü´óµÄÁé»îÐÔ¡£±ÈÈç˵£¬Èç¹ûÎÒÃDz»¹âÏë»ñµÃÈÈË®Æ÷µÄζȣ¬»¹ÏëÔÚObserver¶Ë(¾¯±¨Æ÷»òÕßÏÔʾÆ÷)·½·¨ÖлñµÃËüµÄÉú²úÈÕÆÚ¡¢Ðͺš¢¼Û¸ñ£¬ÄÇôίÍкͷ½·¨µÄÉùÃ÷¶¼»á±äµÃºÜÂé·³£¬¶øÈç¹ûÎÒÃǽ«ÈÈË®Æ÷µÄÒýÓô«¸ø¾¯±¨Æ÷µÄ·½·¨£¬¾Í¿ÉÒÔÔÚ·½·¨ÖÐÖ±½Ó·ÃÎÊÈÈË®Æ÷ÁË¡£

ÏÖÔÚÎÒÃǸÄд֮ǰµÄ·¶Àý£¬ÈÃËü·ûºÏ .Net Framework µÄ¹æ·¶£º

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; //ÕâÀïÊDz»ÊǺÜÊìÏ¤ÄØ£¿
//·ÃÎÊ 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¶È¡£
// Ê¡ÂÔ ...

×ܽá

ÔÚµÚ¶þ¸öÉÔ΢¸´ÔÓµãµÄÈÈË®Æ÷µÄ·¶ÀýÖУ¬ÎÒÏò´ó¼Ò¼òÒª½éÉÜÁË ObserverÉè¼ÆÄ£Ê½£¬²¢Í¨¹ýʵÏÖÕâ¸ö·¶ÀýÍê³ÉÁ˸Ãģʽ£¬Ëæºó½²ÊöÁË.Net FrameworkÖÐίÍС¢Ê¼þµÄʵÏÖ·½Ê½¡£

Ï£ÍûÕâÆªÎÄÕÂÄܸøÄã´øÀ´°ïÖú¡£

   
3131 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì