• 模板方法模式(c++实现)


    模板方法模式

    模式定义

    模板方法模式(Template Function),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    模式动机

    • 当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
    • 既然用了继承,并且肯定这个继承有意义,就应该要成为子类的模板,所有重复嗲吗都应该要上升到父类去,而不是让每个子类都去重复。

    UML类图

    源码实现

    • abstractclass.h
    class AbstractClass
    {
    public:
        AbstractClass();
        virtual ~AbstractClass();
    
        void MethodA();
        virtual int MethodB(int a = 0, int b = 0);
    };		
    
    • abstractclass.cpp
    #include "abstractclass.h"
    #include <iostream>
    
    AbstractClass::AbstractClass()
    {
    
    }
    
    AbstractClass::~AbstractClass()
    {
    
    }
    
    void AbstractClass::MethodA()
    {
        std::cout << __FUNCTION__ << " Call method b :" << this->MethodB(5, 4) << std::endl;
    }
    
    int AbstractClass::MethodB(int a, int b)
    {
        return a + b;
    }
    
    • concreteclassa.h
    #include "abstractclass.h"
    
    class ConcreteClassA : public AbstractClass
    {
    public:
        ConcreteClassA();
        int MethodB(int a = 0, int b = 0) override;
    };
    
    • concreteclassa.cpp
    #include "concreteclassa.h"
    
    ConcreteClassA::ConcreteClassA()
    {
    
    }
    
    int ConcreteClassA::MethodB(int a, int b)
    {
        return a * b;
    }
    
    • concreteclassb.h
    #include "concreteclassb.h"
    
    ConcreteClassB::ConcreteClassB()
    {
    
    }
    
    int ConcreteClassB::MethodB(int a, int b)
    {
        return a - b;
    }
    
    • concreteclassb.cpp
    #include "concreteclassb.h"
    
    ConcreteClassB::ConcreteClassB()
    {
    
    }
    
    int ConcreteClassB::MethodB(int a, int b)
    {
        return a - b;
    }
    
    • main.cpp
    #include <iostream>
    #include "concreteclassa.h"
    #include "concreteclassb.h"
    
    using namespace std;
    
    int main()
    {
        ConcreteClassA* classA = new ConcreteClassA();
        classA->MethodA();
    
        ConcreteClassB* classB = new ConcreteClassB();
        classB->MethodA();
        return 0;
    }
    
    • 运行结果

    MethodA Call method b :20

    MethodA Call method b :1

    优点

    模板方法模式的优点

    • 通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。
    • 提供了一个很好的代码复用的平台。
    • 当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助子类拜托重复的不变行为的纠缠。

    缺点

    模式的缺点

  • 相关阅读:
    Docker为PHP安装gd扩展
    git修改远端仓库地址
    Oracle11g R2学习系列 之四Maven+Struts+Spring实验
    Oracle11g R2学习系列 之三教程选择
    Oracle11g R2学习系列 之二基本概念和环境介绍
    西雅图之行
    Oracle11g R2学习系列 之一安装篇
    Startcom SSL证书申请 IIS设置 配置 攻略
    StartCom 申请 SSL 证书及 Nginx HTTPS 支持配置全攻略
    没有了SA密码,无法Windows集成身份登录,DBA怎么办?
  • 原文地址:https://www.cnblogs.com/wzxNote/p/13298419.html
Copyright © 2020-2023  润新知