zoukankan      html  css  js  c++  java
  • 【设计模式】模板方法模式

     

    模板方法模式

    一个父类【运动会】类

    两个子类,一个【CClass1】类,一个【CClass2】类,班级类是运动会类的子类,父类制定了运动会的流程(算法的逻辑架构),子类分别去实现流程中的具体实现。

    子类不需要重写流程,只需要重写流程中每一项的具体内容。

    以此为例,流程就是先干什么、后干什么、再干什么,而每一项就是分别干的内容。

     

    /************************************************************************
    设计模式
    模板方法模式
    
    模板方法的大概思想是:父类指定某种流程或规则,每个子类在为该流程制定详细的工作。
    
    下面demo以运动会为例,上学的时候开运动会的日子还是比较开心的,因为不用上课。
    运动会总是有一定的流程的,比如每个有班级进场、团队展示、运动员比赛、写稿子
    等等。
    
    ************************************************************************/
    
    //【运动会】类
    class CSportsMeeting
    {
    public:
        CSportsMeeting(string strClassName);
        virtual ~CSportsMeeting();
        virtual void Jinchang() = 0;  //进场
        virtual void Zhanshi() = 0;   //展示,子类去重写这两个虚函数的实现
    
        //运动会流程,子类不需要重写此函数,这个函数指定了流程和逻辑框架
        void SportsSchedule();        
    
    protected:
        string m_strClassName;  //班级名
    };
    
    CSportsMeeting::CSportsMeeting(string strClassName) : m_strClassName(strClassName){}
    CSportsMeeting::~CSportsMeeting(){}
    void CSportsMeeting::SportsSchedule()
    {
        //进场
        Jinchang();
    
        //展示
        Zhanshi();
    }

     

     

     

    //【班级1类】
    class CClass1 : public CSportsMeeting
    {
    public:
        CClass1(string strClassName);
        virtual ~CClass1();
        virtual void Jinchang();
        virtual void Zhanshi(); 
    };
    
    CClass1::CClass1(string strClassName) : CSportsMeeting(strClassName){}
    CClass1::~CClass1(){}
    void CClass1::Jinchang()
    {
        cout << "班级 " <<m_strClassName<<" 进场啦,哈哈
    ";
    }
    
    void CClass1::Zhanshi()
    {
        cout << "班级 " << m_strClassName<<" 展示啦,我们是风骚型的啦!
    ";
    }
    
    //////////////////////////////////////////////////////////////////////////
    
    //【班级2类】
    class CClass2 : public CSportsMeeting
    {
    public:
        CClass2(string strClassName);
        virtual ~CClass2();
        virtual void Jinchang();
        virtual void Zhanshi(); 
    };
    
    CClass2::CClass2(string strClassName) : CSportsMeeting(strClassName){}
    CClass2::~CClass2(){}
    
    void CClass2::Jinchang()
    {
        cout << "班级 "<<m_strClassName<< " 进程啦,都看过来!
    ";
    }
    
    void CClass2::Zhanshi()
    {
        cout << "班级 "<<m_strClassName<<" 展示啦,我们是呆萌型的,么么哒!
    ";
    }

     

     客户端代码

    客户端用子类去实例化每个具体的类,然后将指针赋值给父类指针,父类指针去调用父类的未重写的函数SportsShedule,在此函数中调用的函数为被子类重写了虚函数。

    int _tmain(int argc, _TCHAR* argv[])
    {
        CSportsMeeting* pSport = new CClass1("三年二班");
        pSport->SportsSchedule();
    
        cout<<endl<<endl;
    
        CSportsMeeting* pSport2 = new CClass2("高三四班");
        pSport2->SportsSchedule();
    
    
        cout<<endl<<endl;
    
        return 0;
    }

     

     

     执行结果如下

     

     

     

      

  • 相关阅读:
    learning scala view collection
    scala
    learning scala dependency injection
    learning scala implicit class
    learning scala type alise
    learning scala PartialFunction
    learning scala Function Recursive Tail Call
    learning scala Function Composition andThen
    System.Threading.Interlocked.CompareChange使用
    System.Threading.Monitor的使用
  • 原文地址:https://www.cnblogs.com/cuish/p/3751799.html
Copyright © 2011-2022 走看看