• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-91  評(píng)論-137  文章-0  trackbacks-0

            裝飾模式

            前序

            制作一個(gè)可以給人搭配不同的服飾的系統(tǒng),比如類似QQ,網(wǎng)絡(luò)游戲或論壇都有的Avatar系統(tǒng).

            裝飾模式

            裝飾模式以對(duì)客戶端透明的方式擴(kuò)展對(duì)象的功能,是繼承關(guān)系的一個(gè)替代方案,提供比繼承更多的靈活性。動(dòng)態(tài)給一個(gè)對(duì)象增加功能,這些功能可以再動(dòng)態(tài)的撤消。增加由一些基本功能的排列組合而產(chǎn)生的非常大量的功能。

            實(shí)現(xiàn)方式(UML類圖)

            實(shí)現(xiàn)代碼

            #include <stdio.h>

             

            class Person

            {

            public:

                   Person() : name(0){}

                   Person(char* _name) : name(_name){}

                  

                   virtual void Show()

                   {

                          printf("裝扮的%s",name);

                   }

            protected:

                   char* name;

            };

             

            class Finery : public Person

            {

            public:

                   Finery() : component(0){}

                  

                   void Decorate(Person* component)

                   {

                          this->component = component;

                   }

                  

                   virtual void Show()

                   {

                          if(component) component->Show();

                   }

            protected:

                   Person* component;

            };

             

            class TShirts : public Finery

            {

            public:

                   virtual void Show()

                   {

                          printf("T ");

                          __super::Show();

                   }

            };

             

            class BigTrouser : public Finery

            {

            public:

                   virtual void Show()

                   {

                          printf("跨褲 ");

                          __super::Show();

                   }

            };

             

            class Sneakers : public Finery

            {

            public:

                   virtual void Show()

                   {

                          printf("破球鞋 ");

                          __super::Show();

                   }

            };

             

            class Suit : public Finery

            {

            public:

                   virtual void Show()

                   {

                          printf("西裝 ");

                          __super::Show();

                   }

            };

             

            class Tie : public Finery

            {

            public:

                   virtual void Show()

                   {

                          printf("領(lǐng)帶 ");

                          __super::Show();

                   }

            };

             

            class LeatherShoes : public Finery

            {

            public:

                   virtual void Show()

                   {

                          printf("皮鞋 ");

                          __super::Show();

                   }

            };

             

            int main()

            {

                   Person* xc = new Person("小菜");

                  

                   printf("第一種裝扮:\n");

                  

                   Sneakers* pqx = new Sneakers();

                   BigTrouser* kk = new BigTrouser();

                   TShirts* dtx = new TShirts();

                  

                   pqx->Decorate(xc);

                   kk->Decorate(pqx);

                   dtx->Decorate(kk);

                   dtx->Show();

                  

                   printf("\n第二種裝扮:\n");

                  

                   LeatherShoes* px = new LeatherShoes();

                   Tie* ld = new Tie();

                   Suit* xz = new Suit();

                  

                   px->Decorate(xc);

                   ld->Decorate(px);

                   xz->Decorate(ld);

                   xz->Show();

                  

                   delete xc;

                  

                   delete pqx;

                   delete kk;

                   delete dtx;

                  

                   delete px;

                   delete ld;

                   delete xz;

                   return 0;

            }

            運(yùn)行結(jié)果

            posted on 2011-05-05 16:04 lwch 閱讀(2640) 評(píng)論(5)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式

            評(píng)論:
            # re: 裝飾模式 2011-05-06 12:52 | 千暮(zblc)
            VS10的建模工具真有美感 - -bnr   回復(fù)  更多評(píng)論
              
            # re: 裝飾模式 2011-05-06 16:07 | lwch
            @千暮(zblc)
            截圖下來貌似有點(diǎn)變色..  回復(fù)  更多評(píng)論
              
            # re: 裝飾模式 2012-06-20 22:23 |
            這個(gè)是裝飾器模式嗎??樓主請(qǐng)好好看看書。不要誤人子弟  回復(fù)  更多評(píng)論
              
            # re: 裝飾模式 2012-06-21 17:35 | lwch
            @林
            代碼來源于《大話設(shè)計(jì)模式》  回復(fù)  更多評(píng)論
              
            # re: 裝飾模式 2012-07-11 22:49 | liawof


            #include <iostream>
            #include <string>
            using namespace std;

            class Beverage
            {
            public:
            Beverage():description("Unknown Beverage")
            {

            }
            virtual std::string getDescription()//:description = "Unknown Beverage"
            {
            return description;
            }

            virtual double cost() = 0;
            //{
            // return 0;
            //};

            string description ;

            protected:
            private:

            };


            class CondimenteDecorator :public Beverage
            {
            public:
            virtual string getDescription() = 0;
            //{
            // return description;
            //}
            protected:
            private:
            };


            class Espresso :public Beverage
            {
            public:
            Espresso()
            {
            description = "Espresso";
            }


            double cost()
            {
            return 1.99;
            }
            };


            class HouseBlend :public Beverage
            {
            public:
            HouseBlend()
            {
            description = "HouseBlend";
            }


            double cost()
            {
            return 0.99;
            }
            };


            class DarkRoast :public Beverage
            {
            public:
            DarkRoast()
            {
            description = "DarkRoast";
            }


            double cost()
            {
            return 0.88;
            }
            };


            class Mocha :public CondimenteDecorator
            {
            public:
            Mocha(Beverage *bevergage)
            {
            this->bevergage = bevergage;
            }

            string getDescription()
            {
            return bevergage->getDescription() + string(" Mocha");
            }

            double cost()
            {
            return 0.20 + bevergage->cost();
            }
            protected:
            private:

            Beverage *bevergage;
            };


            class Whip :public CondimenteDecorator
            {
            public:
            Whip(Beverage *bevergage)
            {
            this->bevergage = bevergage;
            }

            string getDescription()
            {
            return bevergage->getDescription() + " Whip";
            }

            double cost()
            {
            return 0.40 + bevergage->cost();
            }
            protected:
            private:

            Beverage *bevergage;
            };


            class Soy :public CondimenteDecorator
            {
            public:
            Soy(Beverage *bevergage)
            {
            this->bevergage = bevergage;
            }

            string getDescription()
            {
            return bevergage->getDescription() + " Soy";
            }

            double cost()
            {
            return 0.40 + bevergage->cost();
            }
            protected:
            private:

            Beverage *bevergage;
            };




            #include "Beverage.h"


            int main()
            {
            Beverage *pBeverage = new Espresso;

            std::cout<<pBeverage->getDescription().c_str()<<" $"<<pBeverage->cost()<<std::endl;


            Beverage *pBeverage2 = new DarkRoast;
            pBeverage2 = new Mocha(pBeverage2);
            pBeverage2 = new Mocha(pBeverage2);
            pBeverage2 = new Whip(pBeverage2);
            std::cout<<pBeverage2->getDescription().c_str()<<" $"<<pBeverage2->cost()/**/<<std::endl;

            Beverage *pBeverage3 = new HouseBlend;
            pBeverage3 = new Soy(pBeverage3);
            pBeverage3 = new Mocha(pBeverage3);
            pBeverage3 = new Whip(pBeverage3);

            std::cout<<pBeverage3->getDescription().c_str()<<" $"<<pBeverage3->cost()<<std::endl;

            return 0;

            }


            這才是真正的裝飾模式!  回復(fù)  更多評(píng)論
              
            日韩一区二区久久久久久| 日本道色综合久久影院| 久久毛片一区二区| 久久www免费人成看片| 久久久老熟女一区二区三区| 久久久精品人妻一区二区三区蜜桃| 国产精品一久久香蕉产线看| 久久精品国产精品亜洲毛片| 久久WWW免费人成一看片| 久久99精品国产自在现线小黄鸭| 国产精品成人久久久久久久| 欧美色综合久久久久久| 7777久久亚洲中文字幕| 久久亚洲国产精品五月天婷| 国产成人精品白浆久久69| 欧美色综合久久久久久| 久久精品国产亚洲综合色| 久久久久久久综合狠狠综合| 国产精品久久久久久久午夜片 | 成人国内精品久久久久影院| 久久久久亚洲AV无码专区桃色| 人妻精品久久无码专区精东影业 | 99久久精品免费看国产一区二区三区| 综合久久一区二区三区| 久久激情亚洲精品无码?V| 久久精品国产亚洲AV高清热 | 久久精品国产91久久麻豆自制| 亚洲伊人久久成综合人影院| 久久伊人精品青青草原高清| 7777久久久国产精品消防器材| 久久性精品| 婷婷久久综合九色综合九七| 成人a毛片久久免费播放| 久久婷婷久久一区二区三区| 色婷婷综合久久久中文字幕| 亚洲国产精品高清久久久| 亚洲国产精品综合久久一线| 亚洲国产精品成人AV无码久久综合影院 | 精品国产VA久久久久久久冰 | 伊人久久亚洲综合影院| 久久免费线看线看|