zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    面向对象的继承关系体现在数据结构上时,如何表示
    codeforces 584C Marina and Vasya
    codeforces 602A Two Bases
    LA 4329 PingPong
    codeforces 584B Kolya and Tanya
    codeforces 584A Olesya and Rodion
    codeforces 583B Robot's Task
    codeforces 583A Asphalting Roads
    codeforces 581C Developing Skills
    codeforces 581A Vasya the Hipster
  • 原文地址:https://www.cnblogs.com/mcy0808/p/10833762.html
Copyright © 2011-2022 走看看