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

1Ôª 10Ôª 50Ôª





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



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

¸ÅÊö

ÔÚÈí¼þϵͳÖУ¬¡°ÐÐΪÇëÇóÕß¡±Óë¡°ÐÐΪʵÏÖÕß¡±Í¨³£³ÊÏÖÒ»ÖÖ¡°½ôñîºÏ¡±¡£µ«ÔÚijЩ³¡ºÏ£¬±ÈÈçÒª¶ÔÐÐΪ½øÐС°¼Ç¼¡¢³·Ïú/ÖØ×ö¡¢ÊÂÎñ¡±µÈ´¦Àí£¬ÕâÖÖÎÞ·¨µÖÓù±ä»¯µÄ½ôñîºÏÊDz»ºÏÊʵġ£ÔÚÕâÖÖÇé¿öÏ£¬ÈçºÎ½«¡°ÐÐΪÇëÇóÕß¡±Óë¡°ÐÐΪʵÏÖÕß¡±½âñ½«Ò»×éÐÐΪ³éÏóΪ¶ÔÏ󣬿ÉÒÔʵÏÖ¶þÕßÖ®¼äµÄËÉñîºÏ[ÀÖÒ]¡£Õâ¾ÍÊDZ¾ÎÄҪ˵µÄCommandģʽ¡£

Òâͼ

½«Ò»¸öÇëÇó·âװΪһ¸ö¶ÔÏ󣬴ӶøʹÄã¿ÉÓò»Í¬µÄÇëÇó¶Ô¿Í»§½øÐвÎÊý»¯£»¶ÔÇëÇóÅŶӻò¼Ç¼ÇëÇóÈÕÖ¾£¬ÒÔ¼°Ö§³Ö¿É³·ÏûµÄ²Ù×÷¡£[GOF ¡¶Éè¼Æģʽ¡·]

½á¹¹Í¼

Commandģʽ½á¹¹Í¼ÈçÏ£º

ͼ1 Commandģʽ½á¹¹Í¼

Éú»îÖеÄÀý×Ó

Commandģʽ½«Ò»¸öÇëÇó·âװΪһ¸ö¶ÔÏ󣬴ӶøʹÄã¿ÉÒÔʹÓò»Í¬µÄÇëÇó¶Ô¿Í»§½øÐвÎÊý»¯¡£ÓòÍʱµÄÕ˵¥ÊÇCommandģʽµÄÒ»¸öÀý×Ó¡£·þÎñÔ±½ÓÊܹ˿͵ĵ㵥£¬°ÑËü¼ÇÔÚÕ˵¥ÉÏ·â×°¡£Õâ¸öµãµ¥±»ÅŶӵȴýÅëâ¿¡£×¢ÒâÕâÀïµÄ"Õ˵¥"ÊDz»ÒÀÀµÓڲ˵¥µÄ£¬Ëü¿ÉÒÔ±»²»Í¬µÄ¹Ë¿ÍʹÓã¬Òò´ËËü¿ÉÒÔÌíÈ벻ͬµÄµãµ¥ÏîÄ¿¡£

ͼ2 ʹÓÃÓòÍÀý×ÓµÄCommandģʽ¶ÔÏóͼ

Commandģʽ½â˵

ÔÚÖÚ¶àµÄÉè¼ÆģʽÖУ¬CommandģʽÊǺܼòµ¥Ò²ºÜÓÅÑŵÄÒ»ÖÖÉè¼Æģʽ¡£CommandģʽËü·â×°µÄÊÇÃüÁ°ÑÃüÁî·¢³öÕßµÄÔðÈκÍÃüÁîÖ´ÐÐÕßµÄÔðÈηֿª¡£ÎÒÃÇÖªµÀ£¬Ò»¸öÀàÊÇÒ»×é²Ù×÷ºÍÏàÓ¦µÄһЩ±äÁ¿µÄ¼¯ºÏ£¬ÏÖÔÚÓÐÕâÑùÒ»¸öÀàDocument£¬ÈçÏ£º

ͼ3

ʾÒâÐÔ´úÂ룺

public class Document

{
    /// 

    /// ÏÔʾ²Ù×÷

    /// 

    public void Display()

    {
        Console.WriteLine("Display");
    } 

    /// 

    /// ³·Ïú²Ù×÷

    /// 

    public void Undo()

    {
        Console.WriteLine("Undo");
    }

    /// 

    /// »Ö¸´²Ù×÷

    /// 

    public void Redo()

    {
        Console.WriteLine("Redo");
    }
}

Ò»°ãÇé¿öÏÂÎÒÃÇʹÓÃÕâ¸öÀàµÄʱºò£¬¶¼»áÕâÑùȥд£º

class Program

{
    static void Main(string[] args)

    {
        Document doc = new Document();

        doc.Display();

        doc.Undo();

        doc.Redo();
    }
}

ÕâÑùµÄʹÓñ¾À´ÊÇûÓÐÈκÎÎÊÌâµÄ£¬µ«ÊÇÎÒÃÇ¿´µ½ÔÚÕâ¸öÌض¨µÄÓ¦ÓÃÖУ¬³öÏÖÁËUndo/RedoµÄ²Ù×÷£¬ÕâʱÈç¹ûÐÐΪµÄÇëÇóÕߺÍÐÐΪµÄʵÏÖÕßÖ®¼ä»¹ÊdzÊÏÖÕâÑùÒ»ÖÖ½ôñîºÏ£¬¾Í²»Ì«ºÏÊÊÁË¡£¿ÉÒÔ¿´µ½£¬¿Í»§³ÌÐòÊÇÒÀÀµÓÚ¾ßÌåDocumentµÄÃüÁ·½·¨£©µÄ£¬ÒýÈëCommandģʽ£¬ÐèÒª¶ÔDocumentÖеÄÈý¸öÃüÁî½øÐгéÏó£¬ÕâÊÇCommandģʽ×îÓÐÒâ˼µÄµØ·½£¬ÒòΪÔÚÎÒÃÇ¿´À´Display()£¬Undo()£¬Redo()ÕâÈý¸ö·½·¨¶¼Ó¦¸ÃÊÇDocumentËù¾ßÓеģ¬Èç¹ûµ¥¶À³éÏó³öÀ´³ÉÒ»¸öÃüÁî¶ÔÏó£¬ÄǾÍÊǰѺ¯Êý²ãÃæµÄ¹¦ÄÜÌáµ½ÁËÀàµÄ²ãÃ棬Óе㹦ÄÜ·Ö½âµÄζµÀ£¬ÎÒ¾õµÃÕâÕýÊÇCommandģʽ½â¾öÕâÀàÎÊÌâµÄÓÅÑÅÖ®´¦£¬ÏȶÔÃüÁî¶ÔÏó½øÐгéÏó£º

ͼ4

ʾÒâÐÔ´úÂ룺

public abstract class DocumentCommand

{
    Document _document;

    public DocumentCommand(Document doc)

    {
        this._document = doc;
    }

    /// 

    /// Ö´ÐÐ

    /// 

    public abstract void Execute();

}

ÆäËûµÄ¾ßÌåÃüÁîÀ඼¼Ì³ÐÓڸóéÏóÀ࣬ÈçÏ£º

ͼ5

ʾÒâÐÔ´úÂ룺

public class DisplayCommand : DocumentCommand

{
    public DisplayCommand(Document doc)

        : base(doc)
    {    

    }

    public override void Execute()

    {
        _document.Display();   
    }
}


/// 

/// ³·ÏúÃüÁî

/// 

public class UndoCommand : DocumentCommand

{ 
    public UndoCommand(Document doc)

        : base(doc)
    {   

    }

    public override void Execute()

    {
        _document.Undo();   
    }
}


/// 

/// ÖØ×öÃüÁî

/// 

public class RedoCommand : DocumentCommand

{
    public RedoCommand(Document doc)

        : base(doc)
    { 

    }

    public override void Execute()

    {
        _document.Redo();   
    } 
}

ÏÖÔÚ»¹ÐèÒªÒ»¸öInvoker½ÇÉ«µÄÀ࣬ÕâÆäʵÏ൱ÓÚÒ»¸öÖмä½ÇÉ«£¬Ç°ÃæÎÒÔø¾­Ëµ¹ý£¬Ê¹ÓÃÕâÑùµÄÒ»¸öÖмä²ãÒ²ÊÇÎÒÃǾ­³£Ê¹ÓõÄÊÖ·¨£¬¼´°ÑA¶ÔBµÄÒÀÀµ×ª»»ÎªA¶ÔCµÄÒÀÀµ¡£ÈçÏ£º

ͼ6

ʾÒâÐÔ´úÂ룺

public class DocumentInvoker

{
    DocumentCommand _discmd;

    DocumentCommand _undcmd;

    DocumentCommand _redcmd;

    public DocumentInvoker(DocumentCommand discmd,DocumentCommand undcmd,DocumentCommand redcmd)
    {

        this._discmd = discmd;

        this._undcmd = undcmd;

        this._redcmd = redcmd;

    }

    public void Display()

    {
        _discmd.Execute();
    }

    public void Undo()

    {
        _undcmd.Execute();
    }

    public void Redo()

    {
        _redcmd.Execute();
    }
}

ÏÖÔÚÔÙÀ´¿´¿Í»§³ÌÐòµÄµ÷ÓôúÂ룺

class Program

{
    static void Main(string[] args)

    {

        Document doc = new Document();


        DocumentCommand discmd = new DisplayCommand(doc);

        DocumentCommand undcmd = new UndoCommand(doc);

        DocumentCommand redcmd = new RedoCommand(doc);


        DocumentInvoker invoker = new DocumentInvoker(discmd,undcmd,redcmd);

        invoker.Display();

        invoker.Undo();

        invoker.Redo();

    }
}

¿ÉÒÔ¿´µ½£º

1£®ÔÚ¿Í»§³ÌÐòÖУ¬²»ÔÙÒÀÀµÓÚDocumentµÄDisplay()£¬Undo()£¬Redo()ÃüÁͨ¹ýCommand¶ÔÕâЩÃüÁî½øÐÐÁË·â×°£¬Ê¹ÓÃËüµÄÒ»¸ö¹Ø¼ü¾ÍÊdzéÏóµÄCommandÀ࣬Ëü¶¨ÒåÁËÒ»¸ö²Ù×÷µÄ½Ó¿Ú¡£Í¬Ê±ÎÒÃÇÒ²¿ÉÒÔ¿´µ½£¬±¾À´ÕâÈý¸öÃüÁî½ö½öÊÇÈý¸ö·½·¨¶øÒÑ£¬µ«ÊÇͨ¹ýCommandģʽȴ°ÑËüÃÇÌáµ½ÁËÀàµÄ²ãÃ棬ÕâÆäʵÊÇÎ¥±³ÁËÃæÏò¶ÔÏóµÄÔ­Ôò£¬µ«ËüÈ´ÓÅÑŵĽâ¾öÁË·ÖÀëÃüÁîµÄÇëÇóÕߺÍÃüÁîµÄÖ´ÐÐÕßµÄÎÊÌ⣬ÔÚʹÓÃCommandģʽµÄʱºò£¬Ò»¶¨ÒªÅжϺÃʹÓÃËüµÄʱ»ú¡£

2£®ÉÏÃæµÄUndo/RedoÖ»ÊǼòµ¥Ê¾ÒâÐÔµÄʵÏÖ£¬Èç¹ûҪʵÏÖÕâÑùµÄЧ¹û£¬ÐèÒª¶ÔÃüÁî¶ÔÏóÉèÖÃÒ»¸ö״̬£¬ÓÉÃüÁî¶ÔÏó¿ÉÒÔ°Ñ״̬´æ´¢ÆðÀ´¡£

.NETÖеÄCommandģʽ

ÔÚASP.NETµÄMVCģʽÖУ¬ÓÐÒ»ÖÖ½ÐFront ControllerµÄģʽ£¬Ëü·ÖΪHandlerºÍCommandÊ÷Á½¸ö²¿·Ö£¬Handler´¦ÀíËùÓй«¹²µÄÂß¼­£¬½ÓÊÕHTTP Post»òGetÇëÇóÒÔ¼°Ïà¹ØµÄ²ÎÊý²¢¸ù¾ÝÊäÈëµÄ²ÎÊýÑ¡ÔñÕýÈ·µÄÃüÁî¶ÔÏó£¬È»ºó½«¿ØÖÆȨ´«µÝµ½Command¶ÔÏó£¬ÓÉÆäÍê³ÉºóÃæµÄ²Ù×÷£¬ÕâÀïÃæÆäʵ¾ÍÊÇÓõ½ÁËCommandģʽ¡£

ͼ7 Front Controller µÄ´¦Àí³ÌÐò²¿·Ö½á¹¹Í¼

ͼ8 Front ControllerµÄÃüÁ·Ö½á¹¹Í¼

Handler ÀฺÔð´¦Àí¸÷¸ö Web ÇëÇ󣬲¢½«È·¶¨ÕýÈ·µÄ Command ¶ÔÏóÕâÒ»Ö°ÔðίÅɸø CommandFactory Àà¡£µ± CommandFactory ·µ»Ø Command ¶ÔÏóºó£¬Handler ½«µ÷Óà Command É쵀 Execute ·½·¨À´Ö´ÐÐÇëÇó¡£¾ßÌåµÄʵÏÖÈçÏÂ

HandlerÀࣺ

public class Handler : IHttpHandler

{
    public void ProcessRequest(HttpContext context)

    {

        Command command = CommandFactory.Make(context.Request.Params);

        command.Execute(context);

    }

    public bool IsReusable

    {
        get

        {
            return true;
        }
    }
}

Command½Ó¿Ú£º

public interface Command

{
    void Execute(HttpContext context);
}

CommandFactoryÀࣺ

public class CommandFactory

{
    public static Command Make(NameValueCollection parms)

    {

        string requestParm = parms["requestParm"];

        Command command = null;

        //¸ù¾ÝÊäÈë²ÎÊýµÃµ½²»Í¬µÄCommand¶ÔÏó

        switch (requestParm)

        {
            case "1":

                command = new FirstPortal();

                break;

            case "2":

                command = new SecondPortal();

                break;

            default:

                command = new FirstPortal();

                break;
        }

        return command;

    }
}

RedirectCommandÀࣺ

public abstract class RedirectCommand : Command

{
    //»ñµÃWeb.ConfigÖж¨ÒåµÄkeyºÍurl¼üÖµ¶Ô£¬UrlMapÀàÏê¼ûÏÂÔØ°üÖеĴúÂë

    private UrlMap map = UrlMap.SoleInstance;

    protected abstract void OnExecute(HttpContext context);

    public void Execute(HttpContext context)

    {
        OnExecute(context);

        //¸ù¾ÝkeyºÍurl¼üÖµ¶ÔÌá½»µ½¾ßÌå´¦ÀíµÄÒ³Ãæ

        string url = String.Format("{0}?{1}", map.Map[context.Request.Url.AbsolutePath], context.Request.Url.Query);

        context.Server.Transfer(url);

    }
}

FirstPortalÀࣺ

public class FirstPortal : RedirectCommand

{
    protected override void OnExecute(HttpContext context)

    {
        //ÔÚÊäÈë²ÎÊýÖмÓÈëÏîportalIdÒÔ±ãÒ³Ãæ´¦Àí

        context.Items["portalId"] = "1";

    }
}

SecondPortalÀࣺ

public class SecondPortal : RedirectCommand

{
    protected override void OnExecute(HttpContext context)

    {
        context.Items["portalId"] = "2";
    }
}

Ч¹û¼°ÊµÏÖÒªµã

1£®CommandģʽµÄ¸ù±¾Ä¿µÄÔÚÓÚ½«¡°ÐÐΪÇëÇóÕß¡±Óë¡°ÐÐΪʵÏÖÕß¡±½âñÔÚÃæÏò¶ÔÏóÓïÑÔÖУ¬³£¼ûµÄʵÏÖÊÖ¶ÎÊÇ¡°½«ÐÐΪ³éÏóΪ¶ÔÏ󡱡£

2£®ÊµÏÖCommand½Ó¿ÚµÄ¾ßÌåÃüÁî¶ÔÏóConcreteCommandÓÐʱºò¸ù¾ÝÐèÒª¿ÉÄܻᱣ´æһЩ¶îÍâµÄ״̬ÐÅÏ¢¡£

3£®Í¨¹ýʹÓÃCompmositeģʽ£¬¿ÉÒÔ½«¶à¸öÃüÁî·âװΪһ¸ö¡°¸´ºÏÃüÁMacroCommand¡£

4£®CommandģʽÓëC#ÖеÄDelegateÓÐЩÀàËÆ¡£µ«Á½Õ߶¨ÒåÐÐΪ½Ó¿ÚµÄ¹æ·¶ÓÐËùÇø±ð£ºCommandÒÔÃæÏò¶ÔÏóÖеġ°½Ó¿Ú-ʵÏÖ¡±À´¶¨ÒåÐÐΪ½Ó¿Ú¹æ·¶£¬¸üÑϸñ£¬¸ü·ûºÏ³éÏóÔ­Ôò£»DelegateÒÔº¯ÊýÇ©ÃûÀ´¶¨ÒåÐÐΪ½Ó¿Ú¹æ·¶£¬¸üÁé»î£¬µ«³éÏóÄÜÁ¦±È½ÏÈõ¡£

5£®Ê¹ÓÃÃüÁîģʽ»áµ¼ÖÂijЩϵͳÓйý¶àµÄ¾ßÌåÃüÁîÀࡣijЩϵͳ¿ÉÄÜÐèÒª¼¸Ê®¸ö£¬¼¸°Ù¸öÉõÖÁ¼¸Ç§¸ö¾ßÌåÃüÁîÀ࣬Õâ»áʹÃüÁîģʽÔÚÕâÑùµÄϵͳÀï±äµÃ²»Êµ¼Ê¡£

ÊÊÓÃÐÔ

ÔÚÏÂÃæµÄÇé¿öÏÂÓ¦µ±¿¼ÂÇʹÓÃÃüÁîģʽ£º

1£®Ê¹ÓÃÃüÁîģʽ×÷Ϊ"CallBack"ÔÚÃæÏò¶ÔÏóϵͳÖеÄÌæ´ú¡£"CallBack"½²µÄ±ãÊÇÏȽ«Ò»¸öº¯ÊýµÇ¼ÇÉÏ£¬È»ºóÔÚÒÔºóµ÷Óô˺¯Êý¡£

2£®ÐèÒªÔÚ²»Í¬µÄʱ¼äÖ¸¶¨ÇëÇó¡¢½«ÇëÇóÅŶӡ£Ò»¸öÃüÁî¶ÔÏóºÍÔ­ÏȵÄÇëÇó·¢³öÕß¿ÉÒÔÓв»Í¬µÄÉúÃüÆÚ¡£»»ÑÔÖ®£¬Ô­ÏȵÄÇëÇó·¢³öÕß¿ÉÄÜÒѾ­²»ÔÚÁË£¬¶øÃüÁî¶ÔÏó±¾ÉíÈÔÈ»ÊǻµÄ¡£ÕâʱÃüÁîµÄ½ÓÊÕÕß¿ÉÒÔÊÇÔÚ±¾µØ£¬Ò²¿ÉÒÔÔÚÍøÂçµÄÁíÍâÒ»¸öµØÖ·¡£ÃüÁî¶ÔÏó¿ÉÒÔÔÚ´®Ðλ¯Ö®ºó´«Ë͵½ÁíÍâһ̨»úÆ÷ÉÏÈ¥¡£

3£®ÏµÍ³ÐèÒªÖ§³ÖÃüÁîµÄ³·Ïû(undo)¡£ÃüÁî¶ÔÏó¿ÉÒÔ°Ñ״̬´æ´¢ÆðÀ´£¬µÈµ½¿Í»§¶ËÐèÒª³·ÏúÃüÁîËù²úÉúµÄЧ¹ûʱ£¬¿ÉÒÔµ÷ÓÃundo()·½·¨£¬°ÑÃüÁîËù²úÉúµÄЧ¹û³·Ïúµô¡£ÃüÁî¶ÔÏ󻹿ÉÒÔÌṩredo()·½·¨£¬ÒÔ¹©¿Í»§¶ËÔÚÐèҪʱ£¬ÔÙÖØÐÂʵʩÃüÁîЧ¹û¡£

4£®Èç¹ûÒ»¸öϵͳҪ½«ÏµÍ³ÖÐËùÓеÄÊý¾Ý¸üе½ÈÕÖ¾ÀÒÔ±ãÔÚϵͳ±ÀÀ£Ê±£¬¿ÉÒÔ¸ù¾ÝÈÕÖ¾Àï¶Á»ØËùÓеÄÊý¾Ý¸üÐÂÃüÁÖØе÷ÓÃExecute()·½·¨Ò»ÌõÒ»ÌõÖ´ÐÐÕâЩÃüÁ´Ó¶ø»Ö¸´ÏµÍ³ÔÚ±ÀÀ£Ç°Ëù×öµÄÊý¾Ý¸üС£

×ܽá

CommandģʽÊǷdz£¼òµ¥¶øÓÖÓÅÑŵÄÒ»ÖÖÉè¼Æģʽ£¬ËüµÄ¸ù±¾Ä¿µÄÔÚÓÚ½«¡°ÐÐΪÇëÇóÕß¡±Óë¡°ÐÐΪʵÏÖÕß¡±½âñî¡£

 

 

   
3174 ´Îä¯ÀÀ       24
Ïà¹ØÎÄÕÂ

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

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

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù 8-23[ÌØ»Ý]
LinuxÄں˱à³Ì¼°É豸Çý¶¯ 8-15[±±¾©]
Python¡¢Êý¾Ý·ÖÎöÓë»úÆ÷ѧϰ 8-23[ÌØ»Ý]
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ 8-22[ÏßÉÏ]
QTÓ¦Óÿª·¢ 9-5[±±¾©]

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

Ïà¹ØÅàѵ¿Î³Ì

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


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