¸ÅÊö
ÔÚÈí¼þϵͳÖУ¬ÓÐʱºòÎÒÃÇ»áʹÓü̳ÐÀ´À©Õ¹¶ÔÏóµÄ¹¦ÄÜ£¬µ«ÊÇÓÉÓڼ̳ÐΪÀàÐÍÒýÈëµÄ¾²Ì¬ÌØÖÊ£¬Ê¹µÃÕâÖÖÀ©Õ¹·½Ê½È±·¦Áé»îÐÔ£»²¢ÇÒËæ×Å×ÓÀàµÄÔö¶à£¨À©Õ¹¹¦ÄܵÄÔö¶à£©£¬¸÷ÖÖ×ÓÀàµÄ×éºÏ£¨À©Õ¹¹¦ÄܵÄ×éºÏ£©»áµ¼Ö¸ü¶à×ÓÀàµÄÅòÕÍ¡£ÈçºÎʹ¡°¶ÔÏó¹¦ÄܵÄÀ©Õ¹¡±Äܹ»¸ù¾ÝÐèÒªÀ´¶¯Ì¬µØÊµÏÖ£¿Í¬Ê±±ÜÃâ¡°À©Õ¹¹¦ÄܵÄÔö¶à¡±´øÀ´µÄ×ÓÀàÅòÕÍÎÊÌ⣿´Ó¶øÊ¹µÃÈκΡ°¹¦ÄÜÀ©Õ¹±ä»¯¡±Ëùµ¼ÖµÄÓ°Ï콫Ϊ×îµÍ£¿Õâ¾ÍÊ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ģʽµÄÓŵãÊÇÌṩÁ˱ȼ̳иü¼ÓÁé»îµÄÀ©Õ¹£¬Í¨¹ýʹÓò»Í¬µÄ¾ßÌå×°ÊÎÀàÒÔ¼°ÕâЩװÊÎÀàµÄÅÅÁÐ×éºÏ£¬¿ÉÒÔ´´Ôì³öºÜ¶à²»Í¬ÐÐΪµÄ×éºÏ¡£
6£®ÓÉÓÚʹÓÃ×°ÊÎģʽ£¬¿ÉÒÔ±ÈʹÓü̳йØÏµÐèÒª½ÏÉÙÊýÄ¿µÄÀࡣʹÓýÏÉÙµÄÀ࣬µ±È»Ê¹Éè¼Æ±È½ÏÒ×ÓÚ½øÐС£µ«ÊÇ£¬ÔÚÁíÒ»·½Ã棬ʹÓÃ×°ÊÎģʽ»á²úÉú±ÈʹÓü̳йØÏµ¸ü¶àµÄ¶ÔÏ󡣸ü¶àµÄ¶ÔÏó»áʹµÃ²é´í±äµÃÀ§ÄÑ£¬ÌرðÊÇÕâЩ¶ÔÏó¿´ÉÏÈ¥¶¼ºÜÏàÏñ¡£
ÊÊÓÃÐÔ
ÔÚÒÔÏÂÇé¿öÏÂÓ¦µ±Ê¹ÓÃ×°ÊÎģʽ£º
1.ÐèÒªÀ©Õ¹Ò»¸öÀàµÄ¹¦ÄÜ£¬»ò¸øÒ»¸öÀàÔö¼Ó¸½¼ÓÔðÈΡ£
2.ÐèÒª¶¯Ì¬µØ¸øÒ»¸ö¶ÔÏóÔö¼Ó¹¦ÄÜ£¬ÕâЩ¹¦ÄÜ¿ÉÒÔÔÙ¶¯Ì¬µØ³·Ïú¡£
3.ÐèÒªÔö¼ÓÓÉһЩ»ù±¾¹¦ÄܵÄÅÅÁÐ×éºÏ¶ø²úÉúµÄ·Ç³£´óÁ¿µÄ¹¦ÄÜ£¬´Ó¶øÊ¹¼Ì³Ð¹ØÏµ±äµÃ²»ÏÖʵ¡£
×ܽá
Decoratorģʽ²ÉÓöÔÏó×éºÏ¶ø·Ç¼Ì³ÐµÄÊÖ·¨£¬ÊµÏÖÁËÔÚÔËÐÐʱ¶¯Ì¬µÄÀ©Õ¹¶ÔÏó¹¦ÄܵÄÄÜÁ¦£¬¶øÇÒ¿ÉÒÔ¸ù¾ÝÐèÒªÀ©Õ¹¶à¸ö¹¦ÄÜ£¬±ÜÃâÁ˵¥¶ÀʹÓü̳дøÀ´µÄ¡°Áé»îÐԲºÍ¡°¶à×ÓÀàÑÜÉúÎÊÌ⡱¡£Í¬Ê±ËüºÜºÃµØ·ûºÏÃæÏò¶ÔÏóÉè¼ÆÔÔòÖС°ÓÅÏÈʹÓöÔÏó×éºÏ¶ø·Ç¼Ì³Ð¡±ºÍ¡°¿ª·Å-·â±Õ¡±ÔÔò¡£ |