国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開(kāi)發(fā) > 綜合 > 正文

Design Patterns: Solidify Your C# Application Arch

2024-07-21 02:28:03
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • 本文來(lái)源于網(wǎng)頁(yè)設(shè)計(jì)愛(ài)好者web開(kāi)發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問(wèn)。
  • design patterns: solidify your c# application architecture with design patterns中文版(下篇)    optimizer(翻譯)
      
    關(guān)鍵字     設(shè)計(jì)模式 singleton strategy decorator composite state
      
    出處     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnmag01/html/patterns.asp
      


    design patterns: solidify your c# application architecture with design patterns中文版(下篇)

    作者:samir bajaj

    譯者:榮耀

    【譯序:c#進(jìn)階文章。譯者對(duì)samir提供的c#例子進(jìn)行了簡(jiǎn)單整理(作者提供的某些代碼在譯者的環(huán)境中無(wú)法通過(guò)編譯),并編寫(xiě)了對(duì)應(yīng)的c++示例,一并置于譯注中,以便讀者比對(duì)。譯文中所有c#、c++程序調(diào)試環(huán)境均為microsoft visual studio.net 7.0 beta2】

    c++示例:

    #include "stdafx.h";

    #include <iostream>

    #include <list>

    using namespace std;

    class shape

    {

    public:

         virtual void draw(){};

    };

    class line : public shape

    {

    private:

         double x1, y1, x2, y2;

    public:

         line(double x1, double y1, double x2, double y2)

         {

              this->x1 = x1;

              this->y1 = y1;

              this->x2 = x2;

              this->y2 = y2;

         }

         void draw()

         {

             //從(x1, y1) 到(x2, y2)畫(huà)一條線

              cout<<"drawing a line"<<endl;

         }

    };

    class circle : public shape

    {

    private:

         double x, y, r;

    public:

         circle(double x, double y, double radius)

         {

              this->x = x;

              this->y = y;

              this->r = r;

         }

         void draw()

         {

            //以(x, y)為圓心,r為半徑畫(huà)一個(gè)圓

              cout<<"drawing a circle"<<endl;

         }

    };

    class drawing : public shape

    {    

    private:

         list<shape*> shapes;

         list<shape*>::iterator it;

    public:

         drawing()

         {

         }

         ~drawing()

         {

             for (it = shapes.begin(); it != shapes.end(); it++)

             {

                  if (*it)

                  {

                       delete *it;

                       *it = null;                   

                  }

             }

              shapes.clear();

         }

         void add(shape* s)

         {

              shapes.push_back(s);

         }

         void draw()

         {

             for (it = shapes.begin(); it != shapes.end(); it++)

             {

                  (dynamic_cast<shape*>(*it))->draw();

             }

         }

    };

    int _tmain(int argc, _tchar* argv[])

    {

         line* line = new line(0, 0, 10, 12);

         circle* circle = new circle(2, 3, 5.5);     

         drawing* dwg = new drawing();

         dwg->add(new line(3, 4, 3, 5));

         dwg->add(new circle(5, 6, 7.7));

         shape* array[3] = {line, circle, dwg};

         // 畫(huà)出所有的圖形,注意:用一致的方式來(lái)訪問(wèn)所有對(duì)象

         for (int i = 0; i < 3; ++i)

         {

              array[i]->draw();

             delete array[i];

         }        

         return 0;

    }

    /*以下是程序輸出結(jié)果:

    drawing a line

    drawing a circle

    drawing a line

    drawing a circle

    */



    state

         每一位開(kāi)發(fā)人員在他(她)的職業(yè)生涯里都至少實(shí)現(xiàn)過(guò)一次有限狀態(tài)機(jī)。你無(wú)法躲避它們,它們無(wú)處不在,并且并不僅僅局限于軟件開(kāi)發(fā)領(lǐng)域。關(guān)于確定性有限自動(dòng)機(jī)的設(shè)計(jì)和實(shí)現(xiàn)方面的文獻(xiàn)隨處可見(jiàn)也是不足為奇的。談到有限狀態(tài)機(jī),我常常驚訝地看到設(shè)計(jì)上糟糕的、實(shí)現(xiàn)上充滿bug的、根本不考慮擴(kuò)展性的案例。可以向有限自動(dòng)機(jī)中加入更多狀態(tài)的能力通常是不成文的要求。當(dāng)需要加入更多的狀態(tài)和轉(zhuǎn)換時(shí),常常需要修改實(shí)現(xiàn)。如果設(shè)計(jì)良好,你就能夠預(yù)見(jiàn)和處理這種變化。更重要的是,有限狀態(tài)機(jī)中的任何狀態(tài)的行為和操作細(xì)節(jié)都只應(yīng)該被限制于對(duì)該狀態(tài)的表示上。換句話說(shuō),狀態(tài)細(xì)節(jié)代碼應(yīng)該駐留在實(shí)現(xiàn)該狀態(tài)的對(duì)象里,這就易于加入新?tīng)顟B(tài)并易于轉(zhuǎn)換。

         基于表查找的方式是有限狀態(tài)機(jī)的一個(gè)流行的設(shè)計(jì)方式。一個(gè)表映射了所有可能的輸入到狀態(tài)轉(zhuǎn)換(即可能會(huì)導(dǎo)致有限狀態(tài)機(jī)變換到另一個(gè)狀態(tài)的轉(zhuǎn)換)。不用說(shuō),盡管這種方式比較簡(jiǎn)單,但如果不對(duì)現(xiàn)有的實(shí)現(xiàn)代碼作重大修改的話,是不可能適應(yīng)變化的需求的。一個(gè)更好的替代方案是使用state設(shè)計(jì)模式。

         假設(shè)用軟件來(lái)實(shí)現(xiàn)一個(gè)碳酸飲料自動(dòng)販賣(mài)機(jī),這個(gè)機(jī)器只接受5分、10分和25分的硬幣,當(dāng)投幣分值累積到或超過(guò)25分時(shí),即發(fā)出一罐飲料。每一次向槽內(nèi)投入硬幣,都會(huì)導(dǎo)致自動(dòng)販賣(mài)機(jī)轉(zhuǎn)換到一個(gè)不同的狀態(tài),直到投幣數(shù)達(dá)到所需的數(shù)量,此時(shí)機(jī)器會(huì)發(fā)出一罐飲料并重置回start狀態(tài)。表10代碼定義了一個(gè)抽象類(lèi)state,它代表自動(dòng)販賣(mài)機(jī)所能變換的所有狀態(tài)的基類(lèi)。

    表10

    abstract class state

    {

    public virtual void addnickel(vendingmachine vm){ }

    public virtual void adddime(vendingmachine vm){ }

    public virtual void addquarter(vendingmachine vm){ }

        protected virtual void changestate(vendingmachine vm, state s)

        {

            vm.changestate(s);

        }

    }


         所有5個(gè)狀態(tài)都從該基類(lèi)派生并重載相應(yīng)的虛方法。例如,當(dāng)自動(dòng)販賣(mài)機(jī)處于start狀態(tài)時(shí),投入一個(gè)5分硬幣,則機(jī)器變?yōu)閒ive狀態(tài),如果再投入一個(gè)5分硬幣,則切換為ten狀態(tài)。這就把轉(zhuǎn)換邏輯分離到每一個(gè)實(shí)現(xiàn)狀態(tài)的對(duì)象中。表11展示了實(shí)現(xiàn)狀態(tài)的兩個(gè)類(lèi)。

    表11

    class start : state

    {

        private static state state = new start();

        private start()

        {

        }

        public static state instance()

        {

            // singleton邏輯

            console.writeline("credit: 0c");

            return state;

        }

        public override void addnickel(vendingmachine vm)

        {

            changestate(vm, five.instance());

        }

        public override void adddime(vendingmachine vm)

        {

            changestate(vm, ten.instance());

        }

        public override void addquarter(vendingmachine vm)

        {

            vm.vend();

        }

    }

    class five : state

    {

        private static state state = new five();

        private five()

        {

        }

        public static state instance()

        {

            // singleton邏輯

            console.writeline("credit: 5c");

            return state;

        }

        public override void addnickel(vendingmachine vm)

        {

            changestate(vm, ten.instance());

        }

        public override void adddime(vendingmachine vm)

        {

            changestate(vm, fifteen.instance());

        }

        public override void addquarter(vendingmachine vm)

        {

            vm.vend();

            changestate(vm, start.instance()); // no change returned :-)

        }

    }


         自動(dòng)販賣(mài)機(jī)不必關(guān)心狀態(tài)轉(zhuǎn)換邏輯,它只管用當(dāng)前state實(shí)例進(jìn)行操作,這樣,就徹底和有關(guān)狀態(tài)細(xì)節(jié)解耦。參見(jiàn)表12。

    表12

    class vendingmachine

    {

        private state state;

        public vendingmachine()

        {

            console.writeline("the vending machine is now online: product costs 25c");

            state = start.instance();

        }

        public void changestate(state to)

        {

            state = to;

        }

        public void vend()

        {

            // 發(fā)飲料

            console.writeline("dispensing product...thank you!");

        }

        public void addnickel()

        {

            state.addnickel(this);

        }

        public void adddime()

        {

            state.adddime(this);

        }

        public void addquarter()

        {

            state.addquarter(this);

        }

    }


         我已經(jīng)說(shuō)明了state模式優(yōu)于簡(jiǎn)單的、基于表查找的實(shí)現(xiàn)方式。總之,這種設(shè)計(jì)模式有助于將狀態(tài)細(xì)節(jié)行為局部化于實(shí)現(xiàn)具體狀態(tài)的類(lèi)中,因此促進(jìn)了軟件的重用和擴(kuò)展。這也避免了在程序代碼中四處亂寫(xiě)條件語(yǔ)句的需要,而那將使維護(hù)代碼的程序員苦不堪言,現(xiàn)實(shí)中,這些負(fù)責(zé)維護(hù)的程序員的人數(shù)遠(yuǎn)遠(yuǎn)多于最初的實(shí)現(xiàn)者。




    發(fā)表評(píng)論 共有條評(píng)論
    用戶(hù)名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    主站蜘蛛池模板: 弥勒县| 若羌县| 凤山市| 怀远县| 射阳县| 衡阳县| 独山县| 依兰县| 威宁| 宝鸡市| 宣恩县| 桦川县| 贞丰县| 克东县| 西和县| 绩溪县| 望谟县| 增城市| 临海市| 丹棱县| 烟台市| 黔西县| 额尔古纳市| 信丰县| 寿光市| 敦化市| 武夷山市| 滨海县| 隆昌县| 永新县| 刚察县| 通化市| 舟曲县| 余干县| 东乌珠穆沁旗| 宝丰县| 泾阳县| 定安县| 彰化市| 江西省| 固安县|