¸ÅÊö
×éºÏģʽÓÐʱºòÓÖ½Ð×ö²¿·Ö-ÕûÌåģʽ£¬ËüʹÎÒÃÇÊ÷ÐͽṹµÄÎÊÌâÖУ¬Ä£ºýÁ˼òµ¥ÔªËغ͸´ÔÓÔªËØµÄ¸ÅÄ¿Í»§³ÌÐò¿ÉÒÔÏò´¦Àí¼òµ¥ÔªËØÒ»ÑùÀ´´¦Àí¸´ÔÓÔªËØ,´Ó¶øÊ¹µÃ¿Í»§³ÌÐòÓ븴ÔÓÔªËØµÄÄÚ²¿½á¹¹½âñî¡£
Òâͼ
½«¶ÔÏó×éºÏ³ÉÊ÷ÐνṹÒÔ±íʾ¡°²¿·Ö-ÕûÌ塱µÄ²ã´Î½á¹¹¡£CompositeģʽʹµÃÓû§¶Ôµ¥¸ö¶ÔÏóºÍ×éºÏ¶ÔÏóµÄʹÓþßÓÐÒ»ÖÂÐÔ¡£[GOF
¡¶Éè¼ÆÄ£Ê½¡·]
½á¹¹Í¼

ͼ1 Compositeģʽ½á¹¹Í¼
Éú»îÖеÄÀý×Ó
×éºÏģʽ½«¶ÔÏó×éºÏ³ÉÊ÷ÐνṹÒÔ±íʾ"²¿·Ö-ÕûÌå"µÄ²ã´Î½á¹¹¡£ÈÃÓû§Ò»ÖµØÊ¹Óõ¥¸ö¶ÔÏóºÍ×éºÏ¶ÔÏó¡£ËäÈ»Àý×Ó³éÏóһЩ£¬µ«ÊÇËãÊõ±í´ïʽȷʵÊÇ×éºÏµÄÀý×Ó¡£ËãÊõ±í´ïʽ°üÀ¨²Ù×÷Êý¡¢²Ù×÷·ûºÍÁíÒ»¸ö²Ù×÷Êý¡£²Ù×÷Êý¿ÉÒÔÊÇÊý×Ö£¬Ò²¿ÉÒÔÊÇÁíÒ»¸ö±í´ïʽ¡£ÕâÑù£¬2+3ºÍ£¨2+3£©+£¨4*6£©¶¼ÊǺϷ¨µÄ±í´ïʽ¡£

ͼ2 ʹÓÃËãÊõ±í´ïʽÀý×ÓµÄCompositeģʽ¶ÔÏóͼ
×éºÏģʽ½â˵
ÕâÀïÎÒÃÇÓûæÍ¼Õâ¸öÀý×ÓÀ´ËµÃ÷Compositeģʽ£¬Í¨¹ýһЩ»ù±¾Í¼ÏñÔªËØ£¨Ö±Ïß¡¢Ô²µÈ£©ÒÔ¼°Ò»Ð©¸´ºÏͼÏñÔªËØ£¨ÓÉ»ù±¾Í¼ÏñÔªËØ×éºÏ¶ø³É£©¹¹½¨¸´ÔÓµÄͼÐÎÊ÷¡£ÔÚÉè¼ÆÖÐÎÒÃǶÔÿһ¸ö¶ÔÏó¶¼Å䱸һ¸öDraw()·½·¨£¬ÔÚµ÷ÓÃʱ£¬»áÏÔʾÏà¹ØµÄͼÐΡ£¿ÉÒÔ¿´µ½£¬ÕâÀ︴ºÏͼÏñÔªËØËüÔڳ䵱¶ÔÏóµÄͬʱ£¬ÓÖÊÇÄÇЩ»ù±¾Í¼ÏñÔªËØµÄÒ»¸öÈÝÆ÷¡£ÏÈ¿´Ò»Ï»ù±¾µÄÀà½á¹¹Í¼£º

ͼ3
ͼÖгÈÉ«µÄÇøÓò±íʾµÄÊǸ´ºÏͼÏñÔªËØ¡£Ê¾ÒâÐÔ´úÂ룺
public abstract class Graphics
{
protected string _name;
public Graphics(string name)
{
this._name = name;
}
public abstract void Draw();
}
public class Picture : Graphics
{
public Picture(string name)
: base(name)
{ }
public override void Draw()
{
//
}
public ArrayList GetChilds()
{
//·µ»ØËùÓеÄ×Ó¶ÔÏó
}
}
|
¶øÆäËû×÷ΪÊ÷Ö¦¹¹¼þ£¬ÊµÏÖ´úÂëÈçÏ£º
public class Line:Graphics
{
public Line(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
public class Circle : Graphics
{
public Circle(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
public class Rectangle : Graphics
{
public Rectangle(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
|
ÏÖÔÚÎÒÃÇÒª¶Ô¸ÃͼÏñÔªËØ½øÐд¦Àí£ºÔÚ¿Í»§¶Ë³ÌÐòÖУ¬ÐèÒªÅжϷµ»Ø¶ÔÏóµÄ¾ßÌåÀàÐ͵½µ×ÊÇ»ù±¾Í¼ÏñÔªËØ£¬»¹ÊǸ´ºÏͼÏñÔªËØ¡£Èç¹ûÊǸ´ºÏͼÏñÔªËØ£¬ÎÒÃǽ«ÒªÓõݹéÈ¥´¦Àí£¬È»¶øÕâÖÖ´¦ÀíµÄ½á¹ûÈ´Ôö¼ÓÁ˿ͻ§¶Ë³ÌÐòÓ븴ÔÓͼÏñÔªËØÄÚ²¿½á¹¹Ö®¼äµÄÒÀÀµ£¬ÄÇôÎÒÃÇÈçºÎÈ¥½âñîÕâÖÖ¹ØÏµÄØ£¿ÎÒÃÇÏ£ÍûµÄÊǿͻ§³ÌÐò¿ÉÒÔÏñ´¦Àí»ù±¾Í¼ÏñÔªËØÒ»ÑùÀ´´¦Àí¸´ºÏͼÏñÔªËØ£¬Õâ¾ÍÒªÒýÈëCompositeģʽÁË£¬ÐèÒª°Ñ¶ÔÓÚ×Ó¶ÔÏóµÄ¹ÜÀí¹¤×÷½»¸ø¸´ºÏͼÏñÔªËØ£¬ÎªÁ˽øÐÐ×Ó¶ÔÏóµÄ¹ÜÀí£¬Ëü±ØÐëÌṩ±ØÒªµÄAdd()£¬Remove()µÈ·½·¨£¬Àà½á¹¹Í¼ÈçÏ£º

ͼ4
ʾÒâÐÔ´úÂ룺
public abstract class Graphics
{
protected string _name;
public Graphics(string name)
{
this._name = name;
}
public abstract void Draw();
public abstract void Add();
public abstract void Remove();
}
public class Picture : Graphics
{
protected ArrayList picList = new ArrayList();
public Picture(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
foreach (Graphics g in picList)
{
g.Draw();
}
}
public override void Add(Graphics g)
{
picList.Add(g);
}
public override void Remove(Graphics g)
{
picList.Remove(g);
}
}
public class Line : Graphics
{
public Line(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
public override void Add(Graphics g)
{ }
public override void Remove(Graphics g)
{ }
}
public class Circle : Graphics
{
public Circle(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
public override void Add(Graphics g)
{ }
public override void Remove(Graphics g)
{ }
}
public class Rectangle : Graphics
{
public Rectangle(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
public override void Add(Graphics g)
{ }
public override void Remove(Graphics g)
{ }
}
|
ÕâÑùÒýÈëCompositeģʽºó£¬¿Í»§¶Ë³ÌÐò²»ÔÙÒÀÀµÓÚ¸´ºÏͼÏñÔªËØµÄÄÚ²¿ÊµÏÖÁË¡£È»¶ø£¬ÎÒÃdzÌÐòÖÐÈÔÈ»´æÔÚ×ÅÎÊÌ⣬ÒòΪLine£¬Rectangle£¬CircleÒѾûÓÐÁË×Ó¶ÔÏó£¬ËüÊÇÒ»¸ö»ù±¾Í¼ÏñÔªËØ£¬Òò´ËAdd()£¬Remove()µÄ·½·¨¶ÔÓÚËüÀ´ËµÃ»ÓÐÈκÎÒâÒ壬¶øÇÒ°ÑÕâÖÖ´íÎó²»»áÔÚ±àÒëµÄʱºò±¨´í£¬°Ñ´íÎó·ÅÔÚÁËÔËÐÐÆÚ£¬ÎÒÃÇÏ£ÍûÄܹ»²¶»ñµ½ÕâÀà´íÎ󣬲¢¼ÓÒÔ´¦Àí£¬ÉÔ΢¸Ä½øÒ»ÏÂÎÒÃǵijÌÐò£º
public class Line : Graphics
{
public Line(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
public override void Add(Graphics g)
{
//Å׳öÒ»¸öÎÒÃÇ×Ô¶¨ÒåµÄÒì³£
}
public override void Remove(Graphics g)
{
//Å׳öÒ»¸öÎÒÃÇ×Ô¶¨ÒåµÄÒì³£
}
}
|
ÕâÑù¸Ä½øÒÔºó£¬ÎÒÃÇ¿ÉÒÔ²¶»ñ¿ÉÄܳöÏֵĴíÎó£¬×ö½øÒ»²½µÄ´¦Àí¡£ÉÏÃæµÄÕâÖÖʵÏÖ·½·¨ÊôÓÚ͸Ã÷ʽµÄCompositeģʽ£¬Èç¹ûÎÒÃÇÏëÒª¸ü°²È«µÄÒ»ÖÖ×ö·¨£¬¾ÍÐèÒª°Ñ¹ÜÀí×Ó¶ÔÏóµÄ·½·¨ÉùÃ÷ÔÚÊ÷Ö¦¹¹¼þPictureÀàÀïÃæ£¬ÕâÑùÈç¹ûÒ¶×Ó½ÚµãLine£¬Rectangle£¬CircleʹÓÃÕâЩ·½·¨Ê±£¬ÔÚ±àÒëÆÚ¾Í»á³ö´í£¬¿´Ò»ÏÂÀà½á¹¹Í¼£º

ͼ5
ʾÒâÐÔ´úÂ룺
public abstract class Graphics
{
protected string _name;
public Graphics(string name)
{
this._name = name;
}
public abstract void Draw();
}
public class Picture : Graphics
{
protected ArrayList picList = new ArrayList();
public Picture(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
foreach (Graphics g in picList)
{
g.Draw();
}
}
public void Add(Graphics g)
{
picList.Add(g);
}
public void Remove(Graphics g)
{
picList.Remove(g);
}
}
public class Line : Graphics
{
public Line(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
public class Circle : Graphics
{
public Circle(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
public class Rectangle : Graphics
{
public Rectangle(string name)
: base(name)
{ }
public override void Draw()
{
Console.WriteLine("Draw a" + _name.ToString());
}
}
|
ÕâÖÖ·½Ê½ÊôÓÚ°²È«Ê½µÄCompositeģʽ£¬ÔÚÕâÖÖ·½Ê½Ï£¬ËäÈ»±ÜÃâÁËÇ°ÃæËùÌÖÂ۵ĴíÎ󣬵«ÊÇËüҲʹµÃÒ¶×Ó½ÚµãºÍÊ÷Ö¦¹¹¼þ¾ßÓв»Ò»ÑùµÄ½Ó¿Ú¡£ÕâÖÖ·½Ê½ºÍ͸Ã÷ʽµÄComposite¸÷ÓÐÓÅÁÓ£¬¾ßÌåʹÓÃÄÄÒ»¸ö£¬ÐèÒª¸ù¾ÝÎÊÌâµÄʵ¼ÊÇé¿ö¶ø¶¨¡£Í¨¹ýCompositeģʽ£¬¿Í»§³ÌÐòÔÚµ÷ÓÃDraw()µÄʱºò²»ÓÃÔÙÈ¥Åжϸ´ÔÓͼÏñÔªËØÖеÄ×Ó¶ÔÏóµ½µ×ÊÇ»ù±¾Í¼ÏñÔªËØ£¬»¹ÊǸ´ÔÓͼÏñÔªËØ£¬¿´Ò»Ï¼òµ¥µÄ¿Í»§¶Ëµ÷Óãº
public class App
{
public static void Main()
{
Picture root = new Picture("Root");
root.Add(new Line("Line"));
root.Add(new Circle("Circle"));
Rectangle r = new Rectangle("Rectangle");
root.Add(r);
root.Draw();
}
}
|
.NETÖеÄ×éºÏģʽ
Èç¹ûÓÐÈËÓùýEnterprise Library2.0£¬Ò»¶¨ÔÚÔ´³ÌÐòÖп´µ½ÁËÒ»¸ö½Ð×öObjectBuilderµÄ³ÌÐò¼¯£¬¹ËÃû˼Ò壬ËüÊÇÓÃÀ´¸ºÔð¶ÔÏóµÄ´´½¨¹¤×÷µÄ£¬¶øÔÚObjectBuilderÖУ¬ÓÐÒ»¸ö±»³ÆÎª¶¨Î»Æ÷µÄ¶«Î÷£¬Í¨¹ý¶¨Î»Æ÷£¬¿ÉÒÔºÜÈÝÒ×µÄÕÒµ½¶ÔÏó£¬ËüµÄ½á¹¹²ÉÓÃÁ´±í½á¹¹£¬Ã¿Ò»¸ö½ÚµãÊÇÒ»¸ö¼üÖµ¶Ô£¬ÓÃÀ´±êʶ¶ÔÏóµÄΨһÐÔ£¬Ê¹µÃ¶ÔÏó²»»á±»ÖØ¸´´´½¨¡£¶¨Î»Æ÷µÄÁ´±í½á¹¹²ÉÓÿÉö¾ÙµÄ½Ó¿ÚÀàÀ´ÊµÏÖ£¬ÕâÑùÎÒÃÇ¿ÉÒÔͨ¹ýÒ»¸öµü´úÆ÷À´±éÀúÕâ¸öÁ´±í¡£Í¬Ê±¶à¸ö¶¨Î»Æ÷Ò²±»´®³ÉÒ»¸öÁ´±í¡£¾ßÌåµØËµ¾ÍÊǶà¸ö¶¨Î»Æ÷×é³ÉÒ»¸öÁ´±í£¬±íÖеÄÿһ¸ö½ÚµãÊÇÒ»¸ö¶¨Î»Æ÷£¬¶¨Î»Æ÷±¾ÉíÓÖÊÇÒ»¸öÁ´±í£¬±íÖб£´æ×Ŷà¸öÓɼüÖµ¶Ô×é³ÉµÄ¶ÔÏóµÄ½Úµã¡£ËùÒÔÕâÊÇÒ»¸öµäÐ͵ÄCompositeģʽµÄÀý×Ó£¬À´¿´ËüµÄ½á¹¹Í¼£º

ͼ6
ÕýÈçÎÒÃÇÔÚͼÖÐËù¿´µ½µÄ£¬IReadableLocator¶¨ÒåÁË×îÉϲãµÄ¶¨Î»Æ÷½Ó¿Ú·½·¨£¬Ëü»ù±¾ÉϾ߱¸Á˶¨Î»Æ÷µÄ´ó²¿·Ö¹¦ÄÜ¡£
²¿·Ö´úÂ룺
public interface IReadableLocator : IEnumerable<KeyValuePair<object, object>> { //·µ»Ø¶¨Î»Æ÷ÖнڵãµÄÊýÁ¿ int Count { get; }
//Ò»¸öÖ¸Ïò¸¸½ÚµãµÄÒýÓÃ
IReadableLocator ParentLocator { get; }
//±íʾ¶¨Î»Æ÷ÊÇ·ñÖ»¶Á
bool ReadOnly { get; }
//²éѯ¶¨Î»Æ÷ÖÐÊÇ·ñÒѾ´æÔÚÖ¸¶¨¼üÖµµÄ¶ÔÏó
bool Contains(object key);
//²éѯ¶¨Î»Æ÷ÖÐÊÇ·ñÒѾ´æÔÚÖ¸¶¨¼üÖµµÄ¶ÔÏ󣬸ù¾Ý¸ø³öµÄËÑË÷Ñ¡Ï±íʾÊÇ·ñÒªÏòÉÏ»ØËݼÌÐøÑ°ÕÒ¡£
bool Contains(object key, SearchMode options);
//ʹÓÃν´Ê²Ù×÷À´²éÕÒ°üº¬¸ø¶¨¶ÔÏóµÄ¶¨Î»Æ÷
IReadableLocator FindBy(Predicate<KeyValuePair<object,
object>> predicate);
//¸ù¾ÝÊÇ·ñ»ØËݵÄÑ¡ÏʹÓÃν´Ê²Ù×÷À´²éÕÒ°üº¬¶ÔÏóµÄ¶¨Î»Æ÷
IReadableLocator FindBy(SearchMode options, Predicate<KeyValuePair<object,
object>> predicate);
//´Ó¶¨Î»Æ÷Öлñȡһ¸öÖ¸¶¨ÀàÐ͵ĶÔÏó
TItem Get<TItem>();
//´Ó¶¨Î»ÆäÖлñȡһ¸öÖ¸¶¨¼üÖµµÄ¶ÔÏó
TItem Get<TItem>(object key);
//¸ù¾ÝÑ¡ÏîÌõ¼þ£¬´Ó¶¨Î»ÆäÖлñȡһ¸öÖ¸¶¨ÀàÐ͵ĶÔÏó
TItem Get<TItem>(object key, SearchMode
options);
//¸ø¶¨¶ÔÏó¼üÖµ»ñÈ¡¶ÔÏóµÄ·Ç·ºÐÍÖØÔØ·½·¨
object Get(object key);
//¸ø¶¨¶ÔÏó¼üÖµ´øËÑË÷Ìõ¼þµÄ·Ç·ºÐÍÖØÔØ·½·¨
object Get(object key, SearchMode options);
} |
Ò»¸ö³éÏó»ùÀàReadableLocatorÓÃÀ´ÊµÏÖÕâ¸ö½Ó¿ÚµÄ¹«¹²·½·¨¡£Á½¸öÖ÷ÒªµÄ·½·¨ÊµÏÖ´úÂëÈçÏ£º
public abstract class ReadableLocator : IReadableLocator { /// <summary> /// ²éÕÒ¶¨Î»Æ÷£¬×îºó·µ»ØÒ»¸öÖ»¶Á¶¨Î»Æ÷µÄʵÀý /// </summary> public IReadableLocator FindBy(SearchMode options, Predicate<KeyValuePair<object, object>> predicate) { if (predicate == null) throw new ArgumentNullException("predicate"); if (!Enum.IsDefined(typeof(SearchMode), options)) throw new ArgumentException(Properties.Resources.InvalidEnumerationValue, "options");
Locator results = new Locator();
IReadableLocator currentLocator = this;
while (currentLocator != null)
{
FindInLocator(predicate, results, currentLocator);
currentLocator = options == SearchMode.Local ?
null : currentLocator.ParentLocator;
}
return new ReadOnlyLocator(results);
}
/// <summary>
/// ±éÀú¶¨Î»Æ÷
/// </summary>
private void FindInLocator(Predicate<KeyValuePair<object,
object>> predicate, Locator results,
IReadableLocator currentLocator)
{
foreach (KeyValuePair<object, object> kvp
in currentLocator)
{
if (!results.Contains(kvp.Key) && predicate(kvp))
{
results.Add(kvp.Key, kvp.Value);
}
}
}
} |
¿ÉÒÔ¿´µ½£¬ÔÚFindBy·½·¨ÀïÃæ£¬Ñ»·µ÷ÓÃÁËFindInLocator·½·¨£¬Èç¹û²éѯѡÏîÊÇÖ»²éÕÒµ±Ç°¶¨Î»Æ÷£¬ÄÇôѻ·ÖÕÖ¹£¬·ñÔòÑØ×Ŷ¨Î»Æ÷µÄ¸¸¶¨Î»Æ÷¼ÌÐøÏòÉϲéÕÒ¡£FindInLocator·½·¨¾ÍÊDZéÀú¶¨Î»Æ÷£¬È»ºó°ÑÕÒµ½µÄ¶ÔÏó´æÈëÒ»¸öÁÙʱµÄ¶¨Î»Æ÷¡£×îºó·µ»ØÒ»¸öÖ»¶Á¶¨Î»Æ÷µÄеÄʵÀý¡£
´ÓÕâ¸ö³éÏó»ùÀàÖÐÅÉÉú³öÒ»¸ö¾ßÌåÀàºÍÒ»¸ö³éÏóÀ࣬һ¸ö¾ßÌåÀàÊÇÖ»¶Á¶¨Î»Æ÷£¨ReadOnlyLocator£©£¬Ö»¶Á¶¨Î»Æ÷ʵÏÖ³éÏó»ùÀàûÓÐʵÏֵķ½·¨£¬Ëü·â×°ÁËÒ»¸öʵÏÖÁËIReadableLocator½Ó¿ÚµÄ¶¨Î»Æ÷£¬È»ºóÆÁ±ÎÄÚ²¿¶¨Î»Æ÷µÄдÈë½Ó¿Ú·½·¨¡£ÁíÒ»¸ö¼Ì³ÐµÄÊǶÁд¶¨Î»Æ÷³éÏóÀàReadWriteLocator£¬ÎªÁËʵÏÖ¶Ô¶¨Î»Æ÷µÄдÈëºÍɾ³ý£¬ÕâÀﶨÒåÁËÒ»¸ö¶ÔIReadableLocator½Ó¿ÚÀ©Õ¹µÄ½Ó¿Ú½Ð×öIReadWriteLocator£¬ÔÚÕâ¸ö½Ó¿ÚÀïÃæÌṩÁËʵÏÖ¶¨Î»Æ÷µÄ²Ù×÷£º

ͼ7
ʵÏÖ´úÂëÈçÏ£º
public interface IReadWriteLocator : IReadableLocator { //±£´æ¶ÔÏóµ½¶¨Î»Æ÷ void Add(object key, object value);
//´Ó¶¨Î»Æ÷ÖÐɾ³ýÒ»¸ö¶ÔÏó£¬Èç¹û³É¹¦·µ»ØÕ棬·ñÔò·µ»Ø¼Ù
bool Remove(object key);
} |
´ÓReadWirteLocatorÅÉÉúµÄ¾ßÌåÀàÊÇLocatorÀ࣬LocatorÀà±ØÐëʵÏÖÒ»¸ö¶¨Î»Æ÷µÄÈ«²¿¹¦ÄÜ£¬ÏÖÔÚÎÒÃÇËù¿´µ½µÄLocatorËüÒѾ¾ßÓÐÁ˹ÜÀí¶¨Î»Æ÷µÄ¹¦ÄÜ£¬Í¬Ê±Ëû»¹Ó¦¸Ã¾ßÓд洢µÄ½á¹¹£¬Õâ¸ö½á¹¹ÊÇͨ¹ýÒ»¸öWeakRefDictionaryÀàÀ´ÊµÏֵģ¬ÕâÀï¾Í²»½éÉÜÁË¡£[¹ØÓÚ¶¨Î»Æ÷µÄ½éÉܲο¼ÁËniwalkerµÄBlog]
Ч¹û¼°ÊµÏÖÒªµã
1£®Compositeģʽ²ÉÓÃÊ÷ÐνṹÀ´ÊµÏ֯ձ鴿ÔڵĶÔÏóÈÝÆ÷£¬´Ó¶ø½«¡°Ò»¶Ô¶à¡±µÄ¹ØÏµ×ª»¯¡°Ò»¶ÔÒ»¡±µÄ¹ØÏµ£¬Ê¹µÃ¿Í»§´úÂë¿ÉÒÔÒ»Öµش¦Àí¶ÔÏóºÍ¶ÔÏóÈÝÆ÷£¬ÎÞÐè¹ØÐÄ´¦ÀíµÄÊǵ¥¸öµÄ¶ÔÏ󣬻¹ÊÇ×éºÏµÄ¶ÔÏóÈÝÆ÷¡£
2£®½«¡°¿Í»§´úÂëÓ븴ÔӵĶÔÏóÈÝÆ÷½á¹¹¡±½âñîÊÇCompositeģʽµÄºËÐÄ˼Ï룬½âñîÖ®ºó£¬¿Í»§´úÂ뽫Óë´¿´âµÄ³éÏó½Ó¿Ú¡ª¡ª¶ø·Ç¶ÔÏóÈÝÆ÷µÄ¸´ÄÚ²¿ÊµÏֽṹ¡ª¡ª·¢ÉúÒÀÀµ¹ØÏµ£¬´Ó¶ø¸üÄÜ¡°Ó¦¶Ô±ä»¯¡±¡£
3£®CompositeģʽÖУ¬Êǽ«¡°AddºÍRemoveµÈºÍ¶ÔÏóÈÝÆ÷Ïà¹ØµÄ·½·¨¡±¶¨ÒåÔÚ¡°±íʾ³éÏó¶ÔÏóµÄComponentÀࡱÖУ¬»¹Êǽ«Æä¶¨ÒåÔÚ¡°±íʾ¶ÔÏóÈÝÆ÷µÄCompositeÀࡱÖУ¬ÊÇÒ»¸ö¹Øºõ¡°Í¸Ã÷ÐÔ¡±ºÍ¡°°²È«ÐÔ¡±µÄÁ½ÄÑÎÊÌ⣬ÐèÒª×ÐϸȨºâ¡£ÕâÀïÓпÉÄÜÎ¥±³ÃæÏò¶ÔÏóµÄ¡°µ¥Ò»Ö°ÔðÔÔò¡±£¬µ«ÊǶÔÓÚÕâÖÖÌØÊâ½á¹¹£¬ÕâÓÖÊDZØÐ븶³öµÄ´ú¼Û¡£ASP.NET¿Ø¼þµÄʵÏÖÔÚÕâ·½ÃæÎªÎÒÃÇÌṩÁËÒ»¸öºÜºÃµÄʾ·¶¡£
4£®CompositeģʽÔÚ¾ßÌåʵÏÖÖУ¬¿ÉÒÔÈø¸¶ÔÏóÖеÄ×Ó¶ÔÏó·´Ïò×·ËÝ£»Èç¹û¸¸¶ÔÏóÓÐÆµ·±µÄ±éÀúÐèÇ󣬿ÉʹÓûº´æ¼¼ÇÉÀ´¸ÄÉÆÐ§ÂÊ¡£
ÊÊÓÃÐÔ
ÒÔÏÂÇé¿öÏÂÊÊÓÃCompositeģʽ£º
1£®ÄãÏë±íʾ¶ÔÏóµÄ²¿·Ö-ÕûÌå²ã´Î½á¹¹
2£®ÄãÏ£ÍûÓû§ºöÂÔ×éºÏ¶ÔÏóÓëµ¥¸ö¶ÔÏóµÄ²»Í¬£¬Óû§½«Í³Ò»µØÊ¹ÓÃ×éºÏ½á¹¹ÖеÄËùÓжÔÏó¡£
×ܽá
×éºÏģʽ½âñîÁ˿ͻ§³ÌÐòÓ븴ÔÓÔªËØÄÚ²¿½á¹¹£¬´Ó¶øÊ¹¿Í»§³ÌÐò¿ÉÒÔÏò´¦Àí¼òµ¥ÔªËØÒ»ÑùÀ´´¦Àí¸´ÔÓÔªËØ¡£
|