zoukankan      html  css  js  c++  java
  • 模板方法模式(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

    优点

    模板方法模式的优点

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

    缺点

    模式的缺点

  • 相关阅读:
    一个比较日期大小的javascript函数
    导出Excel(利用xml标记)
    Oracle 数据库的备份与恢复
    总是浮在页面底部的广告DIV
    实用批处理文件 (IP设置.bat, 清理系统垃圾.bat, atc.)
    【转:来源不详】几家IT公司面试全揭秘
    二级联动(javascript Array)
    JS实现定时循环上翻
    ORACLE函数大全 [转]
    C#中Timer类与线程
  • 原文地址:https://www.cnblogs.com/wzxNote/p/13298419.html
Copyright © 2011-2022 走看看