模板模式和策略模式的区别:
模板方法模式的主要思想:定义一个算法流程,将一些特定步骤的具体实现、延迟到子类。使得可以在不改变算法流程的情况下,通过不同的子类、来实现“定制”流程中的特定的步骤。
策略模式的主要思想:使不同的算法可以被相互替换,而不影响客户端的使用。
简单说:就是类似于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;