我与C++设计模式(十二)——模板模式

template模式是个比较容易理解的模式,它用来解决生活中红这么一种情况:当一个业务逻辑,或者说算法,是在不同的对象中有不同的细节实现,但算法相同时,为了简化接口,可以用template模式,即,定义一个共用的abstract类,将不同的细节实现都定义成虚函数有待各个子类实现,其实就是多态一下。

UML图:

代码:

#ifndef _TEMPALTE_H__
#define _TEMPALTE_H__

class abstract_class
{
        public:
                virtual ~abstract_class();
                void template_method();

        protected:
                virtual void primitive_operation_1() = 0;
                virtual void primitive_operation_2() = 0;
                abstract_class();
};

class concrete_class_A:public abstract_class
{
        public:
                concrete_class_A();
                ~concrete_class_A();

                void primitive_operation_1();
                void primitive_operation_2();
};

class concrete_class_B:public abstract_class
{
        public:
                concrete_class_B();
                ~concrete_class_B();

                void primitive_operation_1();
                void primitive_operation_2();
};

#endif

//template.cpp
#include "template.h"
#include <iostream>
using namespace std;

abstract_class::abstract_class()
{
}

abstract_class::~abstract_class()
{
}

void abstract_class::template_method()
{
        primitive_operation_1();
        primitive_operation_2();
}


concrete_class_A::concrete_class_A()
{
}

concrete_class_A::~concrete_class_A()
{
}

void concrete_class_A::primitive_operation_1()
{
        cout<<"print out from concrete_class_A::primitive_operation_1"<<endl;
}

void concrete_class_A::primitive_operation_2()
{
        cout<<"print out from concrete_class_A::primitive_operation_2"<<endl;
}


concrete_class_B::concrete_class_B()
{
}

concrete_class_B::~concrete_class_B()
{
}

void concrete_class_B::primitive_operation_1()
{
        cout<<"print out from concrete_class_B::primitive_operation_1"<<endl;
}

void concrete_class_B::primitive_operation_2()
{
        cout<<"print out from concrete_class_B::primitive_operation_2"<<endl;
}

//main.cpp
#include "template.h"

int main(int argc,char ** argv)
{
        abstract_class * p_abs = new concrete_class_A();
        p_abs->template_method();

        delete p_abs;

        p_abs = new concrete_class_B();
        p_abs->template_method();

        delete p_abs;

        return 0;
}

对于这个问题其实还可以用strategy pattern解决,敬请收看下一篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值