• 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;
  • 相关阅读:
    Maven配置始终获取最新版本
    使用SpringBoot
    SpringBoot文档综述
    35_方法的使用
    34_结构体指针类型的使用
    33_同名字段的使用
    32_匿名字段的使用
    31_结构体的使用
    30_map的使用
    29_猜字游戏
  • 原文地址:https://www.cnblogs.com/mcy0808/p/10833762.html
Copyright © 2020-2023  润新知