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;
    }

     

     

     执行结果如下

     

     

     

      

  • 相关阅读:
    WCF中的自定义类中包括自定义枚举类型时出错
    Asp.Net无刷新上传并裁剪头像
    C# 字符串模糊查找
    .NET中如何通过文本框中按回车键进行的提交数据
    关于Firefox、Safari 与IE区别实际应用的一点心得
    ASP.NET 网速慢时候按钮禁止重复提交
    ASP.NET前台代码绑定后台变量方法总结
    验证功能在IE中没问题,在火狐浏览器中无反应
    aspx 后台cs文件动态修改Lable 样式
    asp.net程序调试 连接池和 "Timeout expired"异常
  • 原文地址:https://www.cnblogs.com/cuish/p/3751799.html
Copyright © 2011-2022 走看看