設計模式——模板方法模式(C++)

/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:Class.h
@datetime:2016.09.16
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#ifndef _CLASS_H
#define _CLASS_H

// 抽象類:定義算法的框架,將一些步驟延遲到子類中去。
// 在不改變算法框架結構的情況下,進行代碼複用
class AbstractClass {
public:
    virtual void run();
    virtual void fun1() = 0;
    virtual void fun2() = 0;
    virtual void fun3() = 0;
};

// 具體類A:實現抽象類中的方法,完成具體算法
class concreteClassA : public AbstractClass {
    virtual void fun1();
    virtual void fun2();
    virtual void fun3();
};

// 具體類B:實現抽象類中的方法,完成具體算法
class concreteClassB : public AbstractClass {
    virtual void fun1();
    virtual void fun2();
    virtual void fun3();
};

#endif // _CLASS_H
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:Class.cpp
@datetime:2016.09.16
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include "Class.h"

#include <iostream>

using namespace std;

void AbstractClass::run() {
    this->fun1();
    this->fun2();
    this->fun3();
}

void AbstractClass::fun1() {

}


void AbstractClass::fun2() {

}


void AbstractClass::fun3() {

}

void concreteClassA::fun1() {
    cout << "喫咖啡" << endl;
}

void concreteClassA::fun2() {
    cout << "喫中。。。" << endl;
}

void concreteClassA::fun3() {
    cout << "喫完了" << endl;
}

void concreteClassB::fun1() {
    cout << "逛街" << endl;
}

void concreteClassB::fun2() {
    cout << "逛中。。。" << endl;
}

void concreteClassB::fun3() {
    cout << "逛完了" << endl;
}
/*****************************************
Copyright (c) 2016 Jingshuang Hu

@filename:main.cpp
@datetime:2016.09.16
@author:HJS
@e-mail:[email protected]
@blog:http://blog.csdn.net/hujingshuang
*****************************************/
#include <iostream>
#include "Class.h"

using namespace std;

int main() {
    AbstractClass* class1 = new concreteClassA();
    class1->run();

    AbstractClass* class2 = new concreteClassB();
    class2->run();

    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章