×¢²á | µÇ¼ Íü¼ÇÃÜÂ룿 51ctoÊ×Ò³ | ²©¿Í | ÂÛ̳ | ÕÐÆ¸
ÈȵãÎÄÕ Mysql HAʵÏÖMYSQLµÄ¸ß¿ÉÓÃ
¡¡°ïÖú

.NETÉè¼ÆÄ£Ê½£¨10£©£º×°ÊÎģʽ£¨Decorator Pattern£©


2006-03-01 17:49:00
°æÈ¨ÉùÃ÷£ºÔ­´´×÷Æ·£¬ÔÊÐí×ªÔØ£¬×ªÔØÊ±ÇëÎñ±ØÒÔ³¬Á´½ÓÐÎʽ±êÃ÷ÎÄÕ ԭʼ³ö´¦ ¡¢×÷ÕßÐÅÏ¢ºÍ±¾ÉùÃ÷¡£·ñÔò½«×·¾¿·¨ÂÉÔðÈΡ£http://terrylee.blog.51cto.com/342737/67758

×°ÊÎģʽ£¨Decorator Pattern£©

¡ª¡ª.NETÉè¼ÆÄ£Ê½ÏµÁÐ֮ʮ
Terrylee£¬2006Äê3ÔÂ
¸ÅÊö
ÔÚÈí¼þϵͳÖУ¬ÓÐʱºòÎÒÃÇ»áʹÓü̳ÐÀ´À©Õ¹¶ÔÏóµÄ¹¦ÄÜ£¬µ«ÊÇÓÉÓڼ̳ÐΪÀàÐÍÒýÈëµÄ¾²Ì¬ÌØÖÊ£¬Ê¹µÃÕâÖÖÀ©Õ¹·½Ê½È±·¦Áé»îÐÔ£»²¢ÇÒËæ×Å×ÓÀàµÄÔö¶à£¨À©Õ¹¹¦ÄܵÄÔö¶à£©£¬¸÷ÖÖ×ÓÀàµÄ×éºÏ£¨À©Õ¹¹¦ÄܵÄ×éºÏ£©»áµ¼Ö¸ü¶à×ÓÀàµÄÅòÕÍ¡£ÈçºÎʹ¡°¶ÔÏó¹¦ÄܵÄÀ©Õ¹¡±Äܹ»¸ù¾ÝÐèÒªÀ´¶¯Ì¬µØÊµÏÖ£¿Í¬Ê±±ÜÃâ¡°À©Õ¹¹¦ÄܵÄÔö¶à¡±´øÀ´µÄ×ÓÀàÅòÕÍÎÊÌ⣿´Ó¶øÊ¹µÃÈκΡ°¹¦ÄÜÀ©Õ¹±ä»¯¡±Ëùµ¼ÖµÄÓ°Ï콫Ϊ×îµÍ£¿Õâ¾ÍÊDZ¾ÎÄÒª½²µÄDecoratorģʽ¡£
Òâͼ
¶¯Ì¬µØ¸øÒ»¸ö¶ÔÏóÌí¼ÓһЩ¶îÍâµÄÖ°Ôð¡£¾ÍÔö¼Ó¹¦ÄÜÀ´Ëµ£¬DecoratorģʽÏà±ÈÉú³É×ÓÀà¸üΪÁé»î¡£[GOF ¡¶Éè¼ÆÄ£Ê½¡·]
½á¹¹Í¼
ͼ1 Decoratorģʽ½á¹¹Í¼
Éú»îÖеÄÀý×Ó
×°ÊÎģʽ¶¯Ì¬µØ¸øÒ»¸ö¶ÔÏóÌí¼Ó¶îÍâµÄÖ°Ôð¡£²»ÂÛÒ»·ù»­ÓÐûÓл­¿ò¶¼¿ÉÒÔ¹ÒÔÚǽÉÏ£¬µ«ÊÇͨ³£¶¼ÊÇÓл­¿òµÄ£¬²¢ÇÒʵ¼ÊÉÏÊÇ»­¿ò±»¹ÒÔÚǽÉÏ¡£ÔÚ¹ÒÔÚǽÉÏ֮ǰ£¬»­¿ÉÒÔ±»ÃÉÉϲ£Á§£¬×°µ½¿ò×ÓÀÕâʱ»­¡¢²£Á§ºÍ»­¿òÐγÉÁËÒ»¸öÎïÌå¡£
ͼ2 ʹÓÃÓл­¿òµÄ»­×÷ΪÀý×ÓµÄ×°ÊÎģʽ¶ÔÏóͼ
×°ÊÎģʽ½â˵
ÔÚÈí¼þ¿ª·¢ÖУ¬¾­³£»áÓöµ½¶¯Ì¬µØÎªÒ»¸ö¶ÔÏó¶ø²»ÊÇÕû¸öÀàÔö¼ÓһЩ¹¦ÄܵÄÎÊÌ⣬»¹ÊÇÒÔÎÒ¹ßÓõļǼÈÕÖ¾µÄÀý×ÓÀ´ËµÃ÷°É£¨Ò²ÐíÔÚDecoratorģʽÀïÃæÓÃÕâ¸öÀý×Ó²»ÊÇÌØ±ðºÏÊÊ£©¡£ÏÖÔÚÒªÇóÎÒÃÇ¿ª·¢µÄ¼Ç¼ÈÕÖ¾µÄ×é¼þ£¬³ýÁËÒªÖ§³ÖÊý¾Ý¿â¼Ç¼DatabaseLogºÍÎı¾Îļþ¼Ç¼TextFileLogÁ½ÖÖ·½Ê½Í⣬ÎÒÃÇ»¹ÐèÒªÔÚ²»Í¬µÄÓ¦Óû·¾³ÖÐÔö¼ÓһЩ¶îÍâµÄ¹¦ÄÜ£¬±ÈÈçÐèÒª¼Ç¼ÈÕÖ¾ÐÅÏ¢µÄ´íÎóÑÏÖØ¼¶±ð£¬ÐèÒª¼Ç¼ÈÕÖ¾ÐÅÏ¢µÄÓÅÏȼ¶±ð£¬»¹ÓÐÈÕÖ¾ÐÅÏ¢µÄÀ©Õ¹ÊôÐԵȹ¦ÄÜ¡£ÔÚÕâÀÈç¹ûÎÒÃDz»È¥¿¼ÂÇÉè¼ÆÄ£Ê½£¬½â¾öÎÊÌâµÄ·½·¨ÆäʵºÜ¼òµ¥£¬¿ÉÒÔͨ¹ý¼Ì³Ð»úÖÆÈ¥ÊµÏÖ£¬ÈÕÖ¾Àà½á¹¹Í¼ÈçÏ£º
ͼ3
ʵÏÖ´úÂëÈçÏ£º
public abstract class Log
{
    public abstract void Write(string log);
}
public class DatabaseLog : Log
{
    public override void Write(string log)
    {
        //......¼Ç¼µ½Êý¾Ý¿âÖÐ
    }
}
public class TextFileLog : Log
{
    public override void Write(string log)
    {
        //......¼Ç¼µ½Îı¾ÎļþÖÐ
    }
}
ÐèÒª¼Ç¼ÈÕÖ¾ÐÅÏ¢µÄ´íÎóÑÏÖØ¼¶±ð¹¦ÄܺͼǼÈÕÖ¾ÐÅÏ¢ÓÅÏȼ¶±ðµÄ¹¦ÄÜ£¬Ö»ÒªÔÚÔ­À´×ÓÀàDatabaseLogºÍTextFileLogµÄ»ù´¡ÉÏÔÙÉú³É×ÓÀ༴¿É£¬Í¬Ê±ÐèÒªÒý½øÁ½¸öеĽӿÚIErrorºÍI Priority£¬Àà½á¹¹Í¼ÈçÏ£º
ͼ4
ʵÏÖ´úÂëÈçÏ£º
public interface IError
{
    void SetError();
}
public interface IPriority
{
    void SetPriority();
}
public class DBErrorLog : DatabaseLog, IError
{
    public override void Write(string log)
    {
        base.Write(log);
    }
    public void SetError()
    {
       //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼Ǽ´íÎóÑÏÖØ¼¶±ð
    }
}
public class DBPriorityLog : DatabaseLog, IPriority
{
    public override void Write(string log)
    {
        base.Write(log);
    }
    public void SetPriority()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼ǼÓÅÏȼ¶±ð
    }
}
public class TFErrorLog : TextFileLog, IError
{
    public override void Write(string log)
    {
        base.Write(log);
    }
    public void SetError()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼Ǽ´íÎóÑÏÖØ¼¶±ð
    }
}
public class TFPriorityLog : TextFileLog, IPriority
{
    public override void Write(string log)
    {
        base.Write(log);
    }
    public void SetPriority()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼ǼÓÅÏȼ¶±ð
    }
}
´Ëʱ¿ÉÒÔ¿´µ½£¬Èç¹ûÐèÒªÏàÓ¦µÄ¹¦ÄÜ£¬Ö±½ÓʹÓÃÕâЩ×ÓÀà¾Í¿ÉÒÔÁË¡£ÕâÀïÎÒÃDzÉÓÃÁËÀàµÄ¼Ì³Ð·½Ê½À´½â¾öÁ˶ÔÏó¹¦ÄܵÄÀ©Õ¹ÎÊÌ⣬ÕâÖÖ·½Ê½ÊÇ¿ÉÒÔ´ïµ½ÎÒÃÇÔ¤ÆÚµÄÄ¿µÄ¡£È»¶ø£¬ËüÈ´´øÀ´ÁËһϵÁеÄÎÊÌâ¡£Ê×ÏÈ£¬Ç°ÃæµÄ·ÖÎöÖ»ÊǽøÐÐÁËÒ»ÖÖ¹¦ÄܵÄÀ©Õ¹£¬Èç¹û¼ÈÐèÒª¼Ç¼´íÎóÑÏÖØ¼¶±ð£¬ÓÖÐèÒª¼Ç¼ÓÅÏȼ¶Ê±£¬×ÓÀà¾ÍÐèÒª½øÐнӿڵĶàÖØ¼Ì³Ð£¬ÕâÔÚijЩÇé¿öÏ»áÎ¥·´ÀàµÄµ¥Ò»Ö°ÔðÔ­Ôò£¬×¢ÒâÏÂͼÖеÄÀ¶É«ÇøÓò£º
ͼ5
ʵÏÖ´úÂ룺
public class DBEPLog : DatabaseLog, IError, IPriority
{
    public override void Write(string log)
    {
        SetError();
        SetPriority();
        base.Write(log);
    }
    public void SetError()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼Ǽ´íÎóÑÏÖØ¼¶±ð
    }
    public void SetPriority()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼ǼÓÅÏȼ¶±ð
    }
}
public class TFEPLog : DatabaseLog, IError, IPriority
{
    public override void Write(string log)
    {
        SetError();
        SetPriority();
base.Write(log);
    }
    public void SetError()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼Ǽ´íÎóÑÏÖØ¼¶±ð
    }
    public void SetPriority()
    {
        //......¹¦ÄÜÀ©Õ¹£¬ÊµÏÖÁ˼ǼÓÅÏȼ¶±ð
    }
}
Æä´Î£¬Ëæ×ÅÒÔºóÀ©Õ¹¹¦ÄܵÄÔö¶à£¬×ÓÀà»áѸËÙµÄÅòÕÍ£¬¿ÉÒÔ¿´µ½£¬×ÓÀàµÄ³öÏÖÆäʵÊÇDatabaseLogºÍTextFileLogÁ½¸ö×ÓÀàÓëÐÂÔö¼ÓµÄ½Ó¿ÚµÄÒ»ÖÖÅÅÁÐ×éºÏ¹ØÏµ£¬ËùÒÔÀà½á¹¹»á±äµÃºÜ¸´ÔÓ¶øÄÑÒÔά»¤£¬ÕýÈçÏóÀÖÒÀÏʦ˵µÄÄÇÑù¡°×ÓÀิ×ÓÀ࣬×ÓÀàºÎÆä¶à¡±£»×îºó£¬ÕâÖÖ·½Ê½µÄÀ©Õ¹ÊÇÒ»ÖÖ¾²Ì¬µÄÀ©Õ¹·½Ê½£¬²¢Ã»ÓÐÄܹ»ÕæÕýʵÏÖÀ©Õ¹¹¦ÄܵĶ¯Ì¬Ìí¼Ó£¬¿Í»§³ÌÐò²»ÄÜÑ¡ÔñÌí¼ÓÀ©Õ¹¹¦Äܵķ½Ê½ºÍʱ»ú¡£
ÏÖÔÚÓÖ¸ÃÊÇDecoratorģʽ³ö³¡µÄʱºòÁË£¬½â¾ö·½°¸ÊǰÑLog¶ÔÏóǶÈëµ½ÁíÒ»¸ö¶ÔÏóÖУ¬ÓÉÕâ¸ö¶ÔÏóÀ´À©Õ¹¹¦ÄÜ¡£Ê×ÏÈÎÒÃÇÒª¶¨ÒåÒ»¸ö³éÏóµÄ°ü×°ÀàLogWrapper£¬ÈÃËü¼Ì³ÐÓÚLogÀ࣬½á¹¹Í¼ÈçÏ£º
ͼ6
ʵÏÖ´úÂëÈçÏ£º
public abstract class LogWrapper : Log
{
    private Log _log;
    public LogWrapper(Log log)
    {
        _log = log;
    }
    public override void Write(string log)
    {
        _log.Write(log);
    }
}
ÏÖÔÚ¶ÔÓÚÿ¸öÀ©Õ¹µÄ¹¦ÄÜ£¬¶¼Ôö¼ÓÒ»¸ö°ü×°ÀàµÄ×ÓÀ࣬ÈÃËüÃÇÀ´ÊµÏÖ¾ßÌåµÄÀ©Õ¹¹¦ÄÜ£¬ÈçÏÂͼÖÐÂÌÉ«µÄÇøÓò£º
ͼ7
ʵÏÖ´úÂëÈçÏ£º
public class LogErrorWrapper : LogWrapper
{
    public LogErrorWrapper(Log _log)
        :base(_log)
    {
       
    }
    public override void Write(string log)
    {
        SetError(); //......¹¦ÄÜÀ©Õ¹
 
        base.Write(log);
    }
    public void SetError()
    {
        //......ʵÏÖÁ˼Ǽ´íÎóÑÏÖØ¼¶±ð
    }
}
public class LogPriorityWrapper : LogWrapper
{
    public LogPriorityWrapper(Log _log)
        : base(_log)
    {
 
    }
    public override void Write(string log)
    {
        SetPriority(); //......¹¦ÄÜÀ©Õ¹
 
        base.Write(log);
    }
    public void SetPriority()
    {
        //......ʵÏÖÁ˼ǼÓÅÏȼ¶±ð
    }
}
µ½ÕâÀLogErrorWrapperÀàºÍLogPriorityWrapperÀàÕæÕýʵÏÖÁ˶ԴíÎóÑÏÖØ¼¶±ðºÍÓÅÏȼ¶±ðµÄ¹¦ÄܵÄÀ©Õ¹¡£ÎÒÃÇÀ´¿´Ò»Ï¿ͻ§³ÌÐòÈçºÎÈ¥µ÷ÓÃËü£º
public class Program
{
    public static void Main(string[] args)
    {
        Log log = new DatabaseLog();
        LogWrapper lew1 = new LogErrorWrapper(log);
        //À©Õ¹Á˼Ǽ´íÎóÑÏÖØ¼¶±ð
        lew1.Write("Log Message");
 
        LogPriorityWrapper lpw1 = new LogPriorityWrapper(log);
        //À©Õ¹Á˼ǼÓÅÏȼ¶±ð
        lpw1.Write("Log Message");
 
        LogWrapper lew2 = new LogErrorWrapper(log);
        LogPriorityWrapper lpw2 = new LogPriorityWrapper(lew2); //ÕâÀïÊÇlew2
        //ͬʱÀ©Õ¹ÁË´íÎóÑÏÖØ¼¶±ðºÍÓÅÏȼ¶±ð
        lpw2.Write("Log Message");
    }
}
×¢ÒâÔÚÉÏÃæ³ÌÐòÖеĵÚÈý¶Î×°ÊβÅÕæÕýÌåÏÖ³öÁËDecoratorģʽµÄ¾«ÃîËùÔÚ£¬ÕâÀï×ܹ²°ü×°ÁËÁ½´Î£ºµÚÒ»´Î¶Ôlog¶ÔÏó½øÐдíÎóÑÏÖØ¼¶±ðµÄ×°ÊΣ¬±ä³ÉÁËlew2¶ÔÏ󣬵ڶþ´ÎÔÙ¶Ôlew2¶ÔÏó½øÐÐ×°ÊΣ¬ÓÚÊDZä³ÉÁËlpw2¶ÔÏ󣬴ËʱµÄlpw2¶ÔÏóͬʱÀ©Õ¹ÁË´íÎóÑÏÖØ¼¶±ðºÍÓÅÏȼ¶±ðµÄ¹¦ÄÜ¡£Ò²¾ÍÊÇ˵ÎÒÃÇÐèÒªÄÄЩ¹¦ÄÜ£¬¾Í¿ÉÒÔÕâÑù¼ÌÐø°ü×°ÏÂÈ¥¡£µ½ÕâÀïÒ²ÐíÓÐÈË»á˵LogPriorityWrapperÀàµÄ¹¹Ô캯Êý½ÓÊÕµÄÊÇÒ»¸öLog¶ÔÏó£¬ÎªÊ²Ã´ÕâÀï¿ÉÒÔ´«ÈëLogErrorWrapper¶ÔÏóÄØ£¿Í¨¹ýÀà½á¹¹Í¼¾ÍÄÜ·¢ÏÖ£¬LogErrorWrapperÀàÆäʵҲÊÇLogÀàµÄÒ»¸ö×ÓÀà¡£
ÎÒÃÇ·ÖÎöÒ»ÏÂÕâÑù»á´øÀ´Ê²Ã´ºÃ´¦£¿Ê×ÏȶÔÓÚÀ©Õ¹¹¦ÄÜÒѾ­ÊµÏÖÁËÕæÕýµÄ¶¯Ì¬Ôö¼Ó£¬Ö»ÔÚÐèҪijÖÖ¹¦ÄܵÄʱºò²Å½øÐаü×°£»Æä´Î£¬Èç¹ûÔÙ³öÏÖÒ»ÖÖеÄÀ©Õ¹¹¦ÄÜ£¬Ö»ÐèÒªÔö¼ÓÒ»¸ö¶ÔÓ¦µÄ°ü×°×ÓÀࣨעÒ⣺ÕâÒ»µãÈκÎʱºò¶¼ÊDZÜÃâ²»Á˵ģ©£¬¶øÎÞÐèÔÙ½øÐкܶà×ÓÀàµÄ¼Ì³Ð£¬²»»á³öÏÖ×ÓÀàµÄÅòÕÍ£¬Í¬Ê±DecoratorģʽҲºÜºÃµÄ·ûºÏÁËÃæÏò¶ÔÏóÉè¼ÆÔ­ÔòÖеġ°ÓÅÏÈʹÓöÔÏó×éºÏ¶ø·Ç¼Ì³Ð¡±ºÍ¡°¿ª·Å-·â±Õ¡±Ô­Ôò¡£
.NETÖеÄ×°ÊÎģʽ
1£®.NETÖÐDecoratorģʽһ¸öµäÐ͵ÄÔËÓþÍÊǹØÓÚStream£¬Ëü´æÔÚ×ÅÈçϵÄÀà½á¹¹£º
ͼ8
¿ÉÒÔ¿´µ½£¬ BufferedStreamºÍCryptoStreamÆäʵ¾ÍÊÇÁ½¸ö°ü×°À࣬ÕâÀïµÄDecoratorģʽʡÂÔÁ˳éÏó×°ÊνÇÉ«£¨Decorator£©£¬Ê¾Àý´úÂëÈçÏ£º
class Program
{
    public static void Main(string[] args)
    {
        MemoryStream ms =
            new MemoryStream(new byte[] { 100,456,864,222,567});
 
        //À©Õ¹ÁË»º³åµÄ¹¦ÄÜ
        BufferedStream buff = new BufferedStream(ms);
 
        //À©Õ¹ÁË»º³å£¬¼ÓÃܵŦÄÜ
        CryptoStream crypto = new CryptoStream(buff);
    }
}
ͨ¹ý·´±àÒ룬¿ÉÒÔ¿´µ½BufferedStreamÀàµÄ´úÂ루ֻÁгö²¿·Ö£©£¬ËüÊǼ̳ÐÓÚStreamÀࣺ
public sealed class BufferedStream : Stream
{
    // Methods
    private BufferedStream();
    public BufferedStream(Stream stream);
    public BufferedStream(Stream stream, int bufferSize);
    // Fields
    private int _bufferSize;
    private Stream _s;
}
2£®ÔÚEnterprise LibraryÖеÄDAABÖÐÓÐÒ»¸öDbCommandWrapperµÄ°ü×°À࣬ËüʵÏÖÁ˶ÔIDbCommandÀàµÄ°ü×°²¢ÌṩÁ˲ÎÊý´¦ÀíµÄ¹¦ÄÜ¡£½á¹¹Í¼ÈçÏ£º
ͼ9
ʾÒâÐÔ´úÂëÈçÏ£º
public abstract class DBCommandWrapper : MarshalByRefObject, IDisposable
{
 
}
public class SqlCommandWrapper : DBCommandWrapper
{
   
}
public class OracleCommandWrapper : DBCommandWrapper
{
 
}
Ч¹û¼°ÊµÏÖÒªµã
1£®ComponentÀàÔÚDecoratorģʽÖг䵱³éÏó½Ó¿ÚµÄ½ÇÉ«£¬²»Ó¦¸ÃȥʵÏÖ¾ßÌåµÄÐÐΪ¡£¶øÇÒDecoratorÀà¶ÔÓÚComponentÀàÓ¦¸Ã͸Ã÷£¬»»ÑÔÖ®ComponentÀàÎÞÐèÖªµÀDecoratorÀ࣬DecoratorÀàÊÇ´ÓÍⲿÀ´À©Õ¹ComponentÀàµÄ¹¦ÄÜ¡£
2£®DecoratorÀàÔÚ½Ó¿ÚÉϱíÏÖΪis-a ComponentµÄ¼Ì³Ð¹ØÏµ£¬¼´DecoratorÀà¼Ì³ÐÁËComponentÀàËù¾ßÓеĽӿڡ£µ«ÔÚʵÏÖÉÏÓÖ±íÏÖΪhas-a ComponentµÄ×éºÏ¹ØÏµ£¬¼´DecoratorÀàÓÖʹÓÃÁËÁíÍâÒ»¸öComponentÀà¡£ÎÒÃÇ¿ÉÒÔʹÓÃÒ»¸ö»òÕß¶à¸öDecorator¶ÔÏóÀ´¡°×°ÊΡ±Ò»¸öComponent¶ÔÏó£¬ÇÒ×°ÊκóµÄ¶ÔÏóÈÔÈ»ÊÇÒ»¸öComponent¶ÔÏó¡£
3£®Decortorģʽ²¢·Ç½â¾ö¡°¶à×ÓÀàÑÜÉúµÄ¶à¼Ì³Ð¡±ÎÊÌ⣬DecoratorģʽµÄÓ¦ÓÃÒªµãÔÚÓÚ½â¾ö¡°Ö÷ÌåÀàÔÚ¶à¸ö·½ÏòÉϵÄÀ©Õ¹¹¦ÄÜ¡±¡ª¡ªÊÇΪ¡°×°ÊΡ±µÄº¬Òå¡£
4£®¶ÔÓÚDecoratorģʽÔÚʵ¼ÊÖеÄÔËÓÿÉÒÔºÜÁé»î¡£Èç¹ûÖ»ÓÐÒ»¸öConcreteComponentÀà¶øÃ»ÓгéÏóµÄComponentÀ࣬ÄÇôDecoratorÀà¿ÉÒÔÊÇConcreteComponentµÄÒ»¸ö×ÓÀà¡£
ͼ10
Èç¹ûÖ»ÓÐÒ»¸öConcreteDecoratorÀ࣬ÄÇô¾ÍûÓбØÒª½¨Á¢Ò»¸öµ¥¶ÀµÄDecoratorÀ࣬¶ø¿ÉÒÔ°ÑDecoratorºÍConcreteDecoratorµÄÔðÈκϲ¢³ÉÒ»¸öÀà¡£
ͼ11
5£®DecoratorģʽµÄÓŵãÊÇÌṩÁ˱ȼ̳иü¼ÓÁé»îµÄÀ©Õ¹£¬Í¨¹ýʹÓò