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;

猜你喜欢

转载自www.cnblogs.com/mcy0808/p/10833762.html