¼ÙÉèÄãËùÔڵĹ«Ë¾¿ª·¢ÁËÒ»Ì×Ѽ×ÓÄ£ÄâÓÎÏ·£¬Ëü¿ÉÒÔÄ£Äâ¸÷ÖÖ²»Í¬µÄѼ×Ó£¬ÔÚË®ÉÏÓÎÓ¾£¬Í¬Ê±»¹ÄÜ·¢³ö¡°¸Â¸Â¡±µÄ½ÐÉù£¬Ïàµ±ÕæÊµ£¬Òò´ËÂôµÄºÜ²»´í¡£Õâ¸öÓÎÏ·ÊÇÓñê×¼µÄOO¼¼ÊõÀ´Éè¼ÆµÄ£¬Ò»¸ö³éÏóµÄDuck»ùÀ࣬Óз¢³ö¡°¸Â¸Â¡±½ÐÉùµÄQuack·½·¨ºÍÔÚË®ÀïÓÎÓ¾µÄSwim·½·¨£¬Í¬Ê±Ëü»¹ÓÐÒ»¸ö³éÏóµÄDisplay·½·¨£¬Ã¿Ò»¸öDuck×ÓÀࣨÈçMallardDuck¡¢RedheadDuck£©¶¼½«Ö®ÖØÐ´£¬ÒÔ±ãʵÏÖ×Ô¼ºÓëÖÚ²»Í¬µÄÍâ¹Û¡£ÈçÏÂͼ£º

ÄãÃǹ«Ë¾ÓкܶྺÕù¶ÔÊÖ£¬ËûÃǿɲ»ÊdzÔËØµÄ£¬ÔÚÈÕÒæÔö´óµÄÊг¡Ñ¹Á¦Ï£¬ÄãÃÇÀϰå×ö³öÁËÒ»¸ö¾ö¶¨£¬Òª¸Ä½øÕâ¸öÓÎÏ·£¬ÈÃÓÎÏ·ÀïµÄѼ×Ó·ÉÆðÀ´£¬³É¹¦µÄ»°£¬Ò»¶¨¿ÉÒÔ´ò°ÜËùÓеÄÈË¡£Å¶£¬Õâ¸ö¼è¾ÞµÄÈÎÎñ¾Í½»¸øÄãÁË£¬ÄãÊÇÃûºÜºÃµÄOO³ÌÐòÔ±£¬²»ÊÇÂð£¿
½Óµ½ÈÎÎñ£¬ÄãÂíÉϾͿªÊ¼ÁË¡£Õ⻹²»ÈÝÒ×£¿ÔÚDuck»ùÀàÀï¼ÓÒ»¸öFly·½·¨£¬ÕâÑùËùÓеÄDuck×ÓÀà¶¼¿ÉÒÔ»ñµÃÕâ¸ö·½·¨£¬ËùÓеÄѼ×Ó¶¼¿ÉÒÔ·ÉÁË¡£Ì«¼òµ¥ÁË£¬Õâ¾ÍÊÇOOµÄÍþÁ¦Ñ½¡£

µÚ¶þÌ죬Äã¸ß¸ßÐËÐ˵ص½¹«Ë¾Éϰ࣬×òÌìÒѾ°Ñ¸ÄºÃµÄ³ÌÐò½»¸øÀϰåÁË£¬Ëû¿´¹ýÖ®ºó¿Ï¶¨»á˵£¬ÕâС×Ó£¬×öÊÂÇé×öµÄÕæÂéÀû¡£Ä㻹ÔÚÏëÏó×ÅÀϰå»áÔõÑù¿ä½±×Ô¼ºµÄʱºò£¬µç»°ÏìÁË£¬Àϰå´òÀ´µÄ£º¡°ÎÒÏÖÔÚÔÚ¶Ê»áÉÏ£¬¸Õ°ÑÄãµÄ³ÌÐò×öÁËÒ»¸öÑÝʾ£¬Ñ¼×ÓÄÜ·ÉÁË£¬µ«ÊÇÎÒÔõô¿´¼ûÒ»Ö»ÏðƤѼҲÔÚ·É£¿ÍæÐ¦¿ª´óÁ˰ɣ¿Ð¡Ðĵ㣬²»ÒªÈÃÎÒ³´ÁËÄ㣡¡±ÕæÏÅÈË£¬ÉÔÉÔÆ½¾²ÁËÒ»ÏÂÊܾªµÄÐÄÇ飬×ÐϸÏëÏ룬ȷʵÊÇ×Ô¼º¿¼ÂǵIJ»¹»Öܵ½¡£²¢²»ÊÇËùÓеÄѼ×Ó¶¼¿ÉÒÔ·É£¬¿ÉÊǰÑFly·½·¨·ÅÔÚ»ùÀàÀÄÇËùÓÐÖÖÀàµÄѼ×Ó¶¼ÄÜ·ÉÁËѽ¡£Ôõô°ì£¿
ÄãÁé»úÒ»¶¯£¬ÓÖÏëÁËÒ»¸ö·½·¨£¬ÔÚÏðƤѼµÄ×ÓÀàÖУ¬°ÑFly·½·¨ÖØÐ´µô£¬ÈÃËüʲô¶¼²»×ö£¡Ò»Õó¸ßÐ˹ýºó£¬ÄãÓÖÏëÁË¡°¼ÙÈçÒÔºóÎÒÓÖÒª¼ÓÒ»¸öľ֯µÄÓÕ¶üѼµÄʱºò£¬ÎÒ¸ÃÔõô°ì£¬ËüÃDz»ÄܽÐÒ²²»ÄÜ·É¡£¡±ÊÇѽ£¬Ôõô°ì£¿ÓÖ°ÑFlyºÍQuack·½·¨ÖØÐ´µô£¿Ò»Á½¸ö»¹ºÃ£¬¼ÙÈçÓм¸Ê®¸ö£¬Éϰٸö£¬Ò»¸öÒ»¸öÈ¥ÖØÐ´£¿Ì«¿ÉÅÂÁË£¬¸Õ¸Õ±äºÃµÄÐÄÇéÒ»ÏÂ×ÓÓÖ±äµÄÔã¸âÆðÀ´¡£
ÄãÈÏʶµ½£¬°ÑFlyºÍQuack·½·¨·ÅÔÚ»ùÀàÖУ¬È»ºóͨ¹ý¼Ì³ÐÀ´´ïµ½ÀϰåÏëÒªµÄЧ¹ûµÄ·½·¨ÊDz»Ðеġ£ÄãÐèÒªÒ»¸öÇåÎúÃ÷Á˵Ľâ¾ö·½°¸¡£Õâʱ£¬ÄãÃ͵ØÅÄÁËÒ»ÏÂÄÔ´ü£¬ÓýӿÚÔõôÑù£¿
ʹÓýӿÚ
°ÑFly·½·¨´ÓDuck»ùÀàÖÐÌáÈ¡³öÀ´£¬·ÅÔÚÒ»¸ö½ÐIFlyableµÄ½Ó¿ÚÖУ¬Í¬ÑùµØ£¬°ÑQuack·½·¨Ò²ÌáÈ¡³öÀ´£¬·Åµ½IQuackable½Ó¿ÚÖС£ÕâÑùÖ»ÓÐÄÇЩÐèÒª·ÉÐж¯×÷µÄDuck×ÓÀà²ÅȥʵÏÖIFlyable½Ó¿Ú£¬ÐèÒªÄÜ·¢³ö½ÐÉùµÄDuck×ÓÀà²ÅȥʵÏÖIQuackable½Ó¿Ú¡£±ÈÈçRubberDuck²»ÄÜ·É£¬ËùÒÔ²»ÊµÏÖIFlyable½Ó¿Ú£¬µ«Ëü¿ÉÒÔ·¢³öÖ¨Ö¨Éù£¬ËùÒÔҪʵÏÖIQuackable½Ó¿Ú£¬ÓÖÈçDecoyDuck²»ÄÜ·ÉÒ²²»ÄܽУ¬ËùÒÔËüÖ»ÓôÓDuck»ùÀà¼Ì³Ð¾Í¿ÉÒÔÁË¡£UMLͼÈçÏ£º

Õâ¸ö·½·¨Ëƺõ°ÑÎÊÌâ½â¾öÁË£¬µ«ÊÇÔÙ×ÐϸÏëÏ룬ȷʵÊÇÕâÑùÂð£¿
ÓÉÓÚC#µÄ½Ó¿ÚÖÐÖ»ÔÊÐíÉùÃ÷³ÉԱǩÃû£¬¶ø²»ÔÊÐíÓÐÈκδúÂëʵÏÖ£¬ËùÒÔÿһ¸öʵÏÖIFlyable½Ó¿ÚµÄ×ÓÀà¶¼ÐèÒªÌṩ×Ô¼ºµÄFly·½·¨ÊµÏÖ£¬ÕâÑù¾ÍÔì³ÉÁË´óÁ¿µÄÖØ¸´´úÂë¡£ÊÔÏëһϣ¬¼ÙÈç³ÌÐòÀïÒ»¹²ÓÐ48¸öʵÏÖÁËIFlyable½Ó¿ÚµÄ×ÓÀ࣬ʵȻÓÐÒ»ÌìÀϰå˵¡°ÎÒÃÇÐèÒª¸Ä±äÒ»ÏÂFly·½·¨µÄʵÏÖ£¨±ÈÈçÐèҪѼ×ÓÄܷɵĸü¸ßһЩ£©¡±£¬ÄÇÄã¸ÃÔõô°ì£¿Ò»¸öÒ»¸öµØ°ÑÄÇ48¸ö×ÓÀàÈ«²¿¸ÄÒ»±é£¿Ìì°¡£¬ÕâÊDz»¿ÉÏëÏóµÄ¡£Õâ¸ö·½·¨Ö»ÄÜ˵°ÑÄã´ÓÒ»¸öجÃδøµ½ÁËÁíÒ»¸öجÃΣ¬²¢Ã»Óнâ¾öÎÊÌâ¡£
ÊÂʵÊÇÕâÑùµÄ£¬Óû§µÄÐèÇóÿÌì¶¼Ôڱ䣨ÌìÖªµÀËûÃÇÏë¸ÉÂ£©£¬¼ÙÈçÎÒÃÇÄܹ»¾¡¿ÉÄܵļõÉÙÒòÓû§ÐèÇó¸Ä±ä¶øÔì³ÉµÄ³ÌÐò¸Ä¶¯£¬ÄÇÎÒÃǵĻî¶ùÒªÇáËɵĶ࣬ÎÒÃÇ¿ÉÒ԰Ѹü¶àµÄʱ¼ä·ÅÔÚÎÒÃÇ×Ô¼º¸ÐÐËȤµÄÊÂÉÏ£¨ÌßÌßÇò£¬´ò´òÓÎÏ·£©£¬¶ø²»ÊÇϰàºó»¹ÔÚÀϰåµÄÑÛÆ¤Ï¼Ӱà¼Ó°àÔÙ¼Ó°à¡£
Ó¦¸ÃÔõô°ìÄØ£¿ÕâÀï»áÌáµ½Ò»¸ö×¼Ôò£¬Ëü¼¸ºõÊÇËùÓÐÉè¼ÆÄ£Ê½µÄ¾«Ë裬ÄǾÍÊÇ£º
°Ñ±ä»¯µÄ²¿·ÖÌáÈ¡³öÀ´£¬½«Ö®·â×°
¼ò¶øÑÔÖ®£¬¾ÍÊǰÑÔ¤ÆÚ»á·¢Éú±ä»¯µÄ´úÂë·ÖÀë³öÀ´£¬µ¥¶À·ÅÔÚÒ»¿é¶ù£¬ÒÔºóÎÒÃǾͿÉÒÔºÜÈÝÒ×µØÐÞ¸ÄËü£¬¶ø²»»áÓ°Ïìµ½ÒÑÓеĴúÂë¡£
ÎÒÃÇ¿´¿´£¬ÔÚÕâÀïµÄÕâÖÖÇé¿öÏ£¬ÎÒÃÇÓ¦¸ÃÔõô×ö£¿
¶Ô½Ó¿Ú¶ø·Ç¶ÔʵÏÖ±à³Ì
ÏÈ·ÖÎöÒ»ÏÂÔì³ÉÂé·³µÄÔÒò£¬ÀϰåÐèÒª³ÌÐò×öһЩ¸Ä¶¯£¬ÔÚÕâÀ¾ÍÊÇÁ½¸ö·½·¨£¬FlyºÍQuack·½·¨¡£ÕâÁ½¸ö·½·¨ÐèÒªÓкܶàÖÖ²»Í¬µÄʵÏÖ£¬¶øÇÒÒÔºó»¹ÓпÉÄÜ»áÔö¼Ó¡¢Ð޸ġ¢É¾³ý£¬ÄÇô°´ÕÕÉÏÃæµÄÔÔò£¬ÎÒÃǾÍÓ¦¸Ã°ÑÕⲿ·Ö»á±ä¶¯µÄ´úÂëÌáÈ¡³öÀ´£¬½«Ö®ÓëDuck»ùÀà·ÖÀë¡£ÕâÑù£¬ÒÔºóÕⲿ·Ö´úÂëµÄ¸Ä¶¯¾Í²»»áÓ°Ïìµ½DuckÀà¡£Çå³þÁËÎÊÌâËùÔÚ£¬ÄǾͿìµã¶¯ÊÖ½â¾ö°É£¡
µÈµÈ£¬»¹ÐèÒªÁ˽âÒ»¸ö¶«Î÷¡ª¡ª¶à̬¡£
¼òҪ˵һ϶à̬¡£
ʲô½Ð¶à̬£¿¶à̬¾ÍÊÇָΪͬÃûµÄ·½·¨Ìṩ²»Í¬µÄʵÏÖµÄÄÜÁ¦£¬ËüʹµÃÎÒÃDz»ÓùØÐÄ·½·¨µÄ¾ßÌåʵÏÖ¶ø½ö½öÒÀ¿¿ÆäÃû³ÆÀ´½øÐе÷ÓòÙ×÷¡£
ͨ¹ý¶à̬ÎÒÃÇÄܸÉÂ¶à̬µÄÓô¦Ï൱´ó£¡¸ÅÀ¨µØËµ£¬Í¨¹ýËü£¬ÎÒÃÇ¿ÉÒÔʹ´úÂë¸ü¼ÓÇåÎú¡¢¼òÁ·£¬¾ßÌå¿ÉÒÔ¿´¿´AllenµÄÎÄÕ¡¶½ñÌìÄã¶à̬ÁËÂð?¡·
ºÃÁË£¬ÄãÊǶàôºÃµÄÒ»ÃûOO³ÌÐòÔ±£¬¶à̬Ӧ¸ÃÊÇÁËÈçÖ¸ÕÆÁË¡£ÎÒÃÇÀ´¿´¿´ÔõôÓöà̬À´½â¾öÕâ¸öÎÊÌâ¡£
°Ñ±ä»¯µÄ²¿·ÖÌáÈ¡³öÀ´£ºÌáÈ¡Fly·½·¨£¬°ÑËü·Åµ½IFlyBehavior½Ó¿ÚÖУ¬²»Í¬µÄFlyÐÐΪÀࣨ×ÓÀàÐÍ£©¶¼ÊµÏÖÕâ¸ö½Ó¿Ú£¬±ÈÈçFlyWithWings£¬FlyNoWayµÈ¡£Í¬ÑùµØ£¬ÌáÈ¡Quack·½·¨£¬·Åµ½IQuackBehavior½Ó¿ÚÖУ¬²»Í¬µÄQuackÐÐΪÀ඼ʵÏÖÕâ¸ö½Ó¿Ú£¬ÈçQuacks£¬Squeak£¬MuteQuackµÈ¡£ÈçÏÂͼ£º

Èç¹ûÏëÔÚÔËÐÐʱ¶¯Ì¬µÄÉèÖÃDuck×ÓÀàµÄÐÐΪ£¬»¹¿ÉÒÔ¼ÓÈëÁ½¸öSet·½·¨£¬SetFlyBehavior¡¢SetQuackBehavior£¬ÔÚÀïÃæ¸Ä±äflybehaviorºÍquackbehavior±äÁ¿µÄÖµ¡£ÕâÑù£¬¾Í¿ÉÒÔÈÃÒ»¸öÓÕ¶üѼҡÉíÒ»±ä£¬±ä³ÉºìͷѼ£¬¸Â¸ÂµÄ·ÉÉÏÌìÁË¡£
ÏÂÃæÊÇDuck»ùÀà´úÂ룺
using System;

namespace DesignPatterns


{
public abstract class Duck

{
protected IFlybehavior flybehavior;
protected IQuackbehavior quackbehavior;

public void Swim()

{
Console.WriteLine("Swim");
}

public void PerformFly()

{
this.flybehavior.Fly();
}

public void PerformQuack()

{
this.quackbehavior.Quack();
}

public abstract void Display();
}
}
¾ÙÒ»¸ö×ÓÀàµÄÀý×Ó£ºRedheadDuck×ÓÀà´úÂ룺
using System;

namespace DesignPatterns


{
public class RedheadDuck : Duck

{
public RedheadDuck()

{
// ºìͷѼ¿ÉÒÔ·É
this.flyable = new FlyWithWings();
// ºìͷѼ¿ÉÒÔ½Ð
this.quackable = new Quack();
}

public override void Display()

{
Console.WriteLine("I'm a RedheadDuck");
}
}
}×îÖÕµÄUMLͼÈçÏ£º

ºÃÁË£¬ÕâÑùÍê³Éºó£¬´úÂëµÄÎȶ¨ÐԵõ½ÁË¿ÕǰµÄÌá¸ß¡£ÒÔºóÈç¹ûÐèÒªÔö¼ÓһЩ¸üΪÓÐȤµÄÐÐΪ£¬±ÈÈ磺Óë»ð¼ýÒ»Æð·É£¬ÄÇôÄãÓ¦¸ÃÔõô×öÄØ£¿Ö»Ð轨һ¸ö½ÐFlyWithRocketÀ࣬ÈÃËüʵÏÖIFlybehavior½Ó¿Ú£¬ÔÚFly·½·¨Öж¨Òå×Ô¼ºµÄʵÏ־ͿÉÒÔÁË£¬²»ÓÃÈ¥¸Ä¶¯ÏÖÓеĴúÂë¡£Õâ¿ÉÌ«°ôÁË£¡ÒÔºóÄãµÄ¹¤×÷¿É¾ÍÇáËÉ¿©¡£
ºÃÁË£¬ÈÃÎÒÃÇ»»¸ö½Ç¶ÈÏëÏ룬°ÑѼ×ÓµÄһϵÁÐÐÐΪÏëÏó³ÉһϵÁеÄËã·¨£¬±ÈÈçÔ±¹¤¹¤×ʼÆËãËã·¨£¬²Ëµ¥µÄ»æÖÆËã·¨µÈ¡£ÎÒÃǰÑÕâЩËã·¨·â×°ÆðÀ´£¬ÄÇôÆäËüÀà¾Í¿ÉÒÔµ÷Óò»Í¬µÄËã·¨À´¼ÆËã³ö×îºóµÄ½á¹û¡£Èç¹ûËã·¨ÓÐËù¸Ä±ä£¬Ö»Ðè¸Ä¶¯ÕâЩ°üº¬Ëã·¨µÄÀ࣬¶ø²»ÓøĶ¯Ê¹ÓÃÕâЩËã·¨µÄÀà¡£
×îºóÒý³öÁ˲ßÂÔģʽµÄ¶¨Ò壺Õë¶ÔÒ»×éËã·¨£¬½«Ã¿Ò»¸öËã·¨·â×°µ½¾ßÓй²Í¬½Ó¿ÚµÄ¶ÀÁ¢µÄÀàÖУ¬´Ó¶øÊ¹µÃËüÃÇ¿ÉÒÔÏà»¥Ìæ»»£¬ËüʹµÃËã·¨¿ÉÒÔÔÚ²»Ó°Ïì¿Í»§¶ËµÄÇé¿öÏ·¢Éú±ä»¯¡£
ÏÂÔØ´úÂë
ÏÂÔØDoc

