c++設計模式:模板模式


模板模式和策略模式的區別:

模板方法模式的主要思想:定義一個算法流程,將一些特定步驟的具體實現、延遲到子類。使得可以在不改變算法流程的情況下,通過不同的子類、來實現“定制”流程中的特定的步驟。

策略模式的主要思想:使不同的算法可以被相互替換,而不影響客戶端的使用。

 

簡單說:就是類似於C語言的面向過程,然后某一個步驟有兩種實現方式,分別繼承當前類。

// abstract_class.h
#ifndef ABSTRACT_CLASS_H
#define ABSTRACT_CLASS_H
 
#include <iostream>
 
// 公司
class Company
{
public:
    virtual ~Company() {}
 
    // 校園招聘
    void Recruit()
    {
        std::cout << "---------- Begin ----------" << std::endl;
        CareerTalk();
        ReceiveResume();
        Interview();
        Offer();
        std::cout << "---------- End ----------" << std::endl;
    }
 
    // 宣講會
    void CareerTalk() {
        std::cout << "Delivery" << std::endl;
    }
 
    // 接收簡歷
    void ReceiveResume() {
        std::cout << "Receive Resume" << std::endl;
    }
 
    // 面試
    virtual void Interview() = 0;
 
    // 發放 Offer
    virtual void Offer() = 0;
};
 
#endif // ABSTRACT_CLASS_H
// concrete_class.h
#ifndef CONCRETE_CLASS_H
#define CONCRETE_CLASS_H
 
#include "abstract_class.h"
#include <iostream>
 
// 阿里
class Alibaba : public Company//派生類Alibaba繼承自基類Company
{
public:
   // virtual void Interview() override {
         void Interview()  {
        std::cout << "First interview -> Second interview -> Third interview" << std::endl;
    }
//override表示子類覆蓋掉父類的方法,調用時會調用子類的方法,父類對應的方法已經用virtual修飾。
    virtual void Offer() override {  //如果派生類在虛函數聲明時使用了override描述符,那么該函數必須重載其基類中的同名函數,否則代碼將無法通過編譯
        std::cout << "30W" << std::endl;
    }
};
 
// 騰訊
class Tencent : public Company//派生類Tencent也繼承自基類Company
{
public:
    virtual void Interview() override {
        std::cout << "First interview -> Second interview" << std::endl;
    }
 
    virtual void Offer() override {
        std::cout << "25W" << std::endl;
    }
};
 
#endif // CONCRETE_CLASS_H
//mani.cpp
#include "concrete_class.h"
 
#ifndef SAFE_DELETE
#define SAFE_DELETE(p) { if(p){delete(p); (p)=NULL;} }
#endif
 
int main()
{
    // 阿里校招
    Company *alibaba = new Alibaba();//類的指針,用的是內存堆,是個永久變量,除非你釋放它,需要用new運算符分配內存
    alibaba->Recruit();
 
    // 騰訊校招
    Company *tencent = new Tencent();
    tencent->Recruit();
 
    SAFE_DELETE(tencent);
    SAFE_DELETE(alibaba);
 
    getchar();
 
    return 0;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM