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

    优点

    模板方法模式的优点

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

    缺点

    模式的缺点

  • 相关阅读:
    Java 练习题02 (包装类 (对字符串进行排序))
    Java 练习题01(运算符)
    理解有参构造器和无参构造器的作用
    反射;获取类的字节码对象;Class类实例化对象;获取类中的公共构造方法/成员变量/成员方法并执行;暴力反射 (Java Day27)
    网络编程;InetAddress类;UDP协议和TCP协议;Socket编程;UDP编程;TCP编程 (Java Day26)
    序列化 & 反序列化
    几种常用的认证机制
    MySql交换两列
    架构设计思想
    REST资源的URL设计
  • 原文地址:https://www.cnblogs.com/wzxNote/p/13298419.html
Copyright © 2011-2022 走看看