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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
.NETÉè¼ÆÄ£Ê½£¨11£©£º×éºÏģʽ£¨Composite Pattern£©
 
×÷Õß Àî»á¾ü£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-09-22
  2349  次浏览      27
 

¸ÅÊö

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

Òâͼ

½«¶ÔÏó×éºÏ³ÉÊ÷ÐνṹÒÔ±íʾ¡°²¿·Ö-ÕûÌ塱µÄ²ã´Î½á¹¹¡£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£®ÄãÏ£ÍûÓû§ºöÂÔ×éºÏ¶ÔÏóÓëµ¥¸ö¶ÔÏóµÄ²»Í¬£¬Óû§½«Í³Ò»µØÊ¹ÓÃ×éºÏ½á¹¹ÖеÄËùÓжÔÏó¡£

×ܽá

×éºÏģʽ½âñîÁ˿ͻ§³ÌÐòÓ븴ÔÓÔªËØÄÚ²¿½á¹¹£¬´Ó¶øÊ¹¿Í»§³ÌÐò¿ÉÒÔÏò´¦Àí¼òµ¥ÔªËØÒ»ÑùÀ´´¦Àí¸´ÔÓÔªËØ¡£

   
2349 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
Visitor Parttern
ÓÉ±í¼°À￴ģʽ
Éè¼ÆÄ£Ê½Ëæ±ÊϵÁÐ
ÉîÈëdz³öÉè¼ÆÄ£Ê½-½éÉÜ
.NETÖеÄÉè¼ÆÄ£Ê½

Ïà¹ØÅàѵ¿Î³Ì

J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Ó¦ÓÃģʽÉè¼ÆJavaÆóÒµ¼¶Ó¦ÓÃ
Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
J2EEÉè¼ÆÄ£Ê½Ö¸ÄÏ
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Éè¼ÆÄ£Ê½¼°ÆäCSharpʵÏÖ


ijµçÁ¦¹«Ë¾ Éè¼ÆÄ£Ê½Ô­Àí
À¶ÍØÆË Éè¼ÆÄ£Ê½Ô­Àí¼°Ó¦ÓÃ
ÎÀÐǵ¼º½ UML & OOAD
ÌÀɭ·͸Ñз¢ÖÐÐÄ UML& OOAD
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­Àí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
 
 
 
¡¡