模板模式和策略模式的區別:
模板方法模式的主要思想:定義一個算法流程,將一些特定步驟的具體實現、延遲到子類。使得可以在不改變算法流程的情況下,通過不同的子類、來實現“定制”流程中的特定的步驟。
策略模式的主要思想:使不同的算法可以被相互替換,而不影響客戶端的使用。
簡單說:就是類似於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;