上車了不說了,就直接放代碼了哈,有問題可留言。
先放main函數,注意理解注釋哈。
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:main.cpp @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include "Componet.h" // 抽象裝飾類 (抽象的基類) #include "concreteComponet.h" // 被裝飾類 (基類的具體派生類) #include "Decorator.h" // 裝飾方法類 #includeusing namespace std; // 裝飾模式:是為被裝飾者動態的添加裝飾方法,添加的裝飾方法可以任意組合。 // 將基類中的核心方法和非核心方法抽象出來,基類的派生類持有其核心方法不變,並不同的派生類可根據自身需要擴展非核心方法(即:添加裝飾或叫被裝飾) // 將眾多的非核心方法單獨封裝成類(即:裝飾方法類),再利用裝飾模式將裝飾方法類通過擴展接口任意重組添加到派生類中。 // 這樣可以有效地將類的核心方法和非核心方法(裝飾方法)區分開來,簡化基類類和派生類。若要添加新的裝飾方法,則只需建立一個該裝飾方法類, // 再用該類去裝飾某個派生類,這樣就非常好的做到了對"修改關閉,擴展開放"。 int main() { // 對某個派生類進行層層裝飾,最終返回滿足需求的對象 Decorator dec1 = new oneDecorator(new twoDecorator(new threeDecorator(new concreteComponetA))); dec1.dosomething(); dec1.coreFunction1(); dec1.coreFunction2(); // 裝飾方法是可以任意組合的 Decorator dec2 = new threeDecorator(new oneDecorator(new concreteComponetB)); dec2.dosomething(); dec2.coreFunction1(); dec2.coreFunction2(); system("pause"); return 0; }
將基類抽象出來,就是下面這個樣子的。
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:Coomponet.h @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #ifndef _COMPONET_H #define _COMPONET_H // 抽象裝飾類(基類),定義concreteComponet類(即:被裝飾類,派生類)和Decorator類(即:裝飾方法類)的接口。 class Componet { public: void coreFunction1(); // 核心方法1 void coreFunction2(); // 核心方法2 virtual void dosomething() = 0; // 非核心方法(擴展接口) }; #endif // _COMPONET_H
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:Coomponet.cpp @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include "Componet.h" #include然後具體的派生類,也就是被裝飾者的定義及實現:using namespace std; // 基類核心方法1 void Componet::coreFunction1() { cout << "核心方法1" << endl; } // 基類核心方法2 void Componet::coreFunction2() { cout << "核心方法2" << endl; } // 基類可擴展接口(由原有類的派生類去實現,這樣的話不同的派生類都會持有原有類的核心方法,但可以根據自身需要擴展不同的方法) void Componet::dosomething() { }
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:concreteCoomponet.h @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #ifndef _CONCRETECOMPONET_H #define _CONCRETECOMPONET_H #include "Componet.h" // 具體被裝飾類(派生類)A,要實現基類定義的接口 class concreteComponetA : public Componet { public: virtual void dosomething(); }; // 具體被裝飾類(派生類)B,要實現基類定義的接口 class concreteComponetB : public Componet { public: virtual void dosomething(); }; // 具體被裝飾類(派生類)C,要實現基類定義的接口 class concreteComponetC : public Componet { public: virtual void dosomething(); }; #endif // _CONCRETECOMPONET_H
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:concreteCoomponet.cpp @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include "concreteComponet.h" #include最後就是裝飾方法類的定義及實現:using namespace std; // 具體被裝飾類A void concreteComponetA::dosomething() { cout << "A類" << endl; } // 具體被裝飾類B void concreteComponetB::dosomething() { cout << "B類" << endl; } // 具體被裝飾類C void concreteComponetC::dosomething() { cout << "C類" << endl; }
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:Decorator.h @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #ifndef _DECORATOR_H #define _DECORATOR_H #include "Componet.h" class Componet; // 定義裝飾方法類(即:將各種裝飾方法單獨封裝成類) class Decorator : public Componet { private: Componet *com; public: Decorator(Componet *com); virtual void dosomething(); }; // 裝飾方法類1 class oneDecorator : public Componet { private: Componet *com; public: oneDecorator(Componet *com); virtual void dosomething(); }; // 裝飾方法類2 class twoDecorator : public Componet { private: Componet *com; public: twoDecorator(Componet *com); virtual void dosomething(); }; // 裝飾方法類3 class threeDecorator : public Componet { private: Componet *com; public: threeDecorator(Componet *com); virtual void dosomething(); }; #endif // _DECORATOR_H
/***************************************** Copyright (c) 2016 Jingshuang Hu @filename:Decorator.cpp @datetime:2016.09.11 @author:HJS @e-mail:[email protected] @blog:http://blog.csdn.net/hujingshuang *****************************************/ #include "Decorator.h" #include你以為這樣就完了?為方便觀察,不使網頁滑上滑下的,最後再放一下main函數代碼及注釋。using namespace std; // 定義裝飾方法類接口 Decorator::Decorator(Componet *com) { this->com = com; } void Decorator::dosomething() { com->dosomething(); } // 當前被裝飾者 oneDecorator::oneDecorator(Componet *com) { this->com = com; } // 為當前被裝飾者添加裝飾方法1 void oneDecorator::dosomething() { com->dosomething(); cout << "添加了裝飾方法1" << endl; } // 當前被裝飾者 twoDecorator::twoDecorator(Componet *com) { this->com = com; } // 為當前被裝飾者添加裝飾方法2 void twoDecorator::dosomething() { com->dosomething(); cout << "添加了裝飾方法2" << endl; } // 當前被裝飾者 threeDecorator::threeDecorator(Componet *com) { this->com = com; } // 為當前被裝飾者添加裝飾方法3 void threeDecorator::dosomething() { com->dosomething(); cout << "添加了裝飾方法3" << endl; }
// 裝飾模式:是為被裝飾者動態的添加裝飾方法,添加的裝飾方法可以任意組合。 // 將基類中的核心方法和非核心方法抽象出來,基類的派生類持有其核心方法不變,並不同的派生類可根據自身需要擴展非核心方法(即:添加裝飾或叫被裝飾) // 將眾多的非核心方法單獨封裝成類(即:裝飾方法類),再利用裝飾模式將裝飾方法類通過擴展接口任意重組添加到派生類中。 // 這樣可以有效地將類的核心方法和非核心方法(裝飾方法)區分開來,簡化基類類和派生類。若要添加新的裝飾方法,則只需建立一個該裝飾方法類, // 再用該類去裝飾某個派生類,這樣就非常好的做到了對"修改關閉,擴展開放"。 int main() { // 對某個派生類進行層層裝飾,最終返回滿足需求的對象 Decorator dec1 = new oneDecorator(new twoDecorator(new threeDecorator(new concreteComponetA))); dec1.dosomething(); dec1.coreFunction1(); dec1.coreFunction2(); // 裝飾方法是可以任意組合的 Decorator dec2 = new threeDecorator(new oneDecorator(new concreteComponetB)); dec2.dosomething(); dec2.coreFunction1(); dec2.coreFunction2(); system("pause"); return 0; }結果: