• <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>
            蝸牛的家
            男兒當自強
            posts - 48,  comments - 21,  trackbacks - 0
            意圖:
            表示一個作用與某對象結構中的各元素的操作,它使你可以在不改變各元素的類的前提下定義作用于這些元素的新操作
            UML圖:


            適用:
            一個對象結構包含很多類對象,他們有不同的接口,而你想對這些對象實施一些依賴于其具體類的操作
            需要對一個對象結構中的對象進行很多不同的并且不相關的操作,而你想避免讓這些操作污染這些對象的類,Vi s i t o r 使得你可以將相關的操作集中起來定義在一個類中。當該對象結構被很多應用共享時,用Vi s i t o r 模式讓每個應用僅包含需要用到的操作
            定義對象結構的類很少變化,但經(jīng)常需要在此結構上定義新的操作,改變對象結構類需要重定義對所有訪問者的接口,這可能需要很大的代價,如果對象結構類經(jīng)常改變,那么可能還有在這些類中定義這些操作較好
            //test.h
            //////////////////////////////////////////////////////////////////////////
            class Visitor;

            class Element
            {
            public:
                
            virtual ~Element(){}
                
                
            virtual void Accept(Visitor &rVisitor) = 0;
            protected:
                Element()
            {}
            }
            ;

            class ConCreateElementA : public Element
            {
            public:
                
            virtual ~ConCreateElementA(){}
                
                
            virtual void Accept(Visitor &rVisitor);
            }
            ;

            class ConCreateElementB : public Element
            {
            public:
                
            virtual ~ConCreateElementB(){}

                
            virtual void Accept(Visitor &rVisitor);
            }
            ;

            class Visitor
            {
            public:
                
            virtual ~Visitor(){}
                
                
            virtual void VisitConcreateElementA(ConCreateElementA *pConcreateElementA) = 0;
                
            virtual void VisitConcreateElementB(ConCreateElementB *pConcreateElementB) = 0;
            protected:
                Visitor()
            {}
            }
            ;

            class ConcreateVisitorA
                : 
            public Visitor
            {
            public:
                
            virtual ~ConcreateVisitorA(){}

                
            virtual void VisitConcreateElementA(ConCreateElementA *pConcreateElementA);
                
            virtual void VisitConcreateElementB(ConCreateElementB *pConcreateElementB);
            }
            ;

            class ConcreateVisitorB
                : 
            public Visitor
            {
            public:
                
            virtual ~ConcreateVisitorB(){}

                
            virtual void VisitConcreateElementA(ConCreateElementA *pConcreateElementA);
                
            virtual void VisitConcreateElementB(ConCreateElementB *pConcreateElementB);
            }
            ;

            // test.cpp : Defines the entry point for the console application.
            //

            #include 
            "stdafx.h"
            #include 
            <iostream>
            #include 
            "test.h"
            //////////////////////////////////////////////////////////////////////////
            void ConCreateElementA::Accept(Visitor &rVisitor)
            {
                rVisitor.VisitConcreateElementA(
            this);
            }


            void ConCreateElementB::Accept(Visitor &rVisitor)
            {
                rVisitor.VisitConcreateElementB(
            this);
            }


            void ConcreateVisitorA::VisitConcreateElementA(ConCreateElementA *pConcreateElementA)
            {
                std::cout 
            << "VisitConcreateElementA By ConcreateVisitorA\n";
            }


            void ConcreateVisitorA::VisitConcreateElementB(ConCreateElementB *pConcreateElementA)
            {
                std::cout 
            << "VisitConcreateElementB By ConcreateVisitorA\n";
            }


            void ConcreateVisitorB::VisitConcreateElementA(ConCreateElementA *pConcreateElementA)
            {
                std::cout 
            << "VisitConcreateElementA By ConcreateVisitorB\n";
            }


            void ConcreateVisitorB::VisitConcreateElementB(ConCreateElementB *pConcreateElementA)
            {
                std::cout 
            << "VisitConcreateElementB By ConcreateVisitorB\n";
            }

            //////////////////////////////////////////////////////////////////////////
            int main(int argc, char* argv[])
            {
                Visitor 
            *pVisitor = new ConcreateVisitorA;
                Element 
            *pElement = new ConCreateElementA;
                
                pElement
            ->Accept(*pVisitor);
                
                delete pElement;
                delete pVisitor;

                system(
            "pause");
                
            return 0;
            }

            posted on 2008-08-23 12:18 黑色天使 閱讀(597) 評論(0)  編輯 收藏 引用 所屬分類: 設計模式

            <2008年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章檔案

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            久久人人爽人人人人片av| 欧洲精品久久久av无码电影| 无码国内精品久久人妻| 欧美精品丝袜久久久中文字幕| 久久精品国产亚洲av麻豆小说 | 亚洲狠狠婷婷综合久久蜜芽| 韩国无遮挡三级久久| 精品熟女少妇a∨免费久久| 麻豆成人久久精品二区三区免费| 久久久久亚洲av无码专区导航| 国产99久久久国产精品小说| 欧美国产成人久久精品| 精品无码久久久久久久动漫| 国产精品伦理久久久久久| 精品多毛少妇人妻AV免费久久| 日日狠狠久久偷偷色综合免费| 久久久久亚洲精品天堂久久久久久 | 久久久精品人妻一区二区三区蜜桃| 久久精品黄AA片一区二区三区| aaa级精品久久久国产片| 国产午夜精品理论片久久影视| 国内精品久久久久影院网站| 国产精品免费看久久久香蕉| 蜜桃麻豆www久久国产精品| 久久精品国产2020| 99国产欧美精品久久久蜜芽| 日本精品久久久久中文字幕| 久久久精品视频免费观看 | 久久人人爽爽爽人久久久| 狠狠色丁香婷婷综合久久来 | 国产999精品久久久久久| 久久久久亚洲av成人无码电影| 一本色道久久HEZYO无码| 久久66热人妻偷产精品9| 狠狠久久综合伊人不卡| 一本一本久久a久久综合精品蜜桃| 青青草原综合久久| 久久精品人人做人人爽电影| 久久亚洲精品中文字幕三区| 久久无码高潮喷水| 国产精品一区二区久久精品无码 |