[行为型模式] 模板方法模式的理解




头文件
//TemplateMethodPattern.h

#ifndef TEMPLATE_METHOD_PATTERN_H
#define TEMPLATE_METHOD_PATTERN_H

#include <Windows.h>
#include <iostream>
using namespace std;

namespace TemplateMethodPattern
{
    //////////////////////////////////////////////////////////////////////////
    class AbstractClass
    {
    public:
        AbstractClass();
        virtual ~AbstractClass();

        void TemplateMethod();

    protected:
        virtual void PrimitiveOperation1() = 0;
        virtual void PrimitiveOperation2() = 0;
    };

    //////////////////////////////////////////////////////////////////////////
    class ConcreteClassA : public AbstractClass
    {
    public:
        ConcreteClassA();
        virtual ~ConcreteClassA();

    protected:
        virtual void PrimitiveOperation1();
        virtual void PrimitiveOperation2();
    };

    //////////////////////////////////////////////////////////////////////////
    class ConcreteClassB : public AbstractClass
    {
    public:
        ConcreteClassB();
        virtual ~ConcreteClassB();

    protected:
        virtual void PrimitiveOperation1();
        virtual void PrimitiveOperation2();
    };

    //////////////////////////////////////////////////////////////////////////
    void TemplateMethodPattern_Test();
}

#endif

实现
#include "TemplateMethodPattern.h"

namespace TemplateMethodPattern
{
    //////////////////////////////////////////////////////////////////////////
    AbstractClass::AbstractClass()
    {}

    AbstractClass::~AbstractClass()
    {}

    void AbstractClass::TemplateMethod()
    {
        PrimitiveOperation1();
        cout<<"TemplateMethod"<<endl;
        PrimitiveOperation2();
    }

    void AbstractClass::PrimitiveOperation1()
    {
        cout<<"Default Operation1"<<endl;
    }

    void AbstractClass::PrimitiveOperation2()
    {
        cout<<"Default Operation2"<<endl;
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteClassA::ConcreteClassA()
    {}

    ConcreteClassA::~ConcreteClassA()
    {}

    void ConcreteClassA::PrimitiveOperation1()
    {
        cout<<"ConcreteA Operation1"<<endl;
    }

    void ConcreteClassA::PrimitiveOperation2()
    {
        cout<<"ConcreteA Operation2"<<endl;
    }

    //////////////////////////////////////////////////////////////////////////
    ConcreteClassB::ConcreteClassB(){}
    ConcreteClassB::~ConcreteClassB(){}
    void ConcreteClassB::PrimitiveOperation1()
    {
        cout<<"ConcreteB Operation1"<<endl;
    }

    void ConcreteClassB::PrimitiveOperation2()
    {
        cout<<"ConcreteB Operation2"<<endl;
    }

    //////////////////////////////////////////////////////////////////////////
    void TemplateMethodPattern_Test()
    {
        AbstractClass *pAbstractA = new ConcreteClassA;
        pAbstractA->TemplateMethod();

        AbstractClass *pAbstractB = new ConcreteClassB;
        pAbstractB->TemplateMethod();

        if (pAbstractA) delete pAbstractA;
        if (pAbstractB) delete pAbstractB;
    }
}

客户端
#include "TemplateMethodPattern.h"


#include <iostream>
using namespace std;
using namespace TemplateMethodPattern;

void main()
{
    TemplateMethodPattern_Test();
}

运行结果



用例模型




设计类图


顺序图

猜你喜欢

转载自jacky-dai.iteye.com/blog/2304940