昨天木有事做,於是去民大的圖書館借了本《設計模式之禪》來看,之前軟考見過組合模式和裝飾模式,覺得虛函數、多態、面向對象似乎很神奇,這些設計模式尤其產生了一些不可思議的效果。今天用c++實驗了一下裝飾模式。確實比較厲害!
裝飾模式主要用來擴展一個類的功能,即裝飾。類圖如下:
測試代碼照搬自《設計模式之禪》,關於裝飾四年級成績單,加年級排名和單項最高分。
代碼如下:
#include <iostream>
#include <string>
using namespace std;
/*component*/
class SchoolReport
{
public:
virtual void report(void) {}
virtual void sign(string) {}
};
/*ConcreteComponent*/
class FouthGradeSchoolReport:public SchoolReport
{
public:
void report()
{
puts("尊敬的4年級的XXX家長:");
puts(" .......");
puts(" 語文 62 數學 65 體育 98 自然 63");
puts(" .......");
puts(" 家長簽名:");
}
void sign(string name)
{
puts(name.c_str());
}
};
/*Decorator*/
class Decorator:public SchoolReport
{
private:
/*注意!這裏要定義成指針,否則會調用不到父類的函數*/
SchoolReport *sr ;
public:
Decorator(SchoolReport *sr) { this->sr = sr ; }
void report()
{
this->sr->report();
}
void sign(string name)
{
this->sr->sign(name);
}
};
/*ConcreteDecoratorA*/
class HighScoreDecorator:public Decorator
{
public:
HighScoreDecorator(SchoolReport *sr):Decorator(sr) {}
private:
void reportHighScore() { puts("這次考試語文最高是75,數學是78,自然是80"); }
public:
void report() { this->reportHighScore(); this->Decorator::report(); }
};
/*ConcreteDecoratorB*/
class SortDecorator:public Decorator
{
public:
SortDecorator(SchoolReport* sr):Decorator(sr) {}
private:
void reportSort() { puts("我是排名第38名..."); }
public:
void report() { this->Decorator::report(); this->reportSort(); }
};
/*測試*/
int main()
{
SchoolReport *sr = new FouthGradeSchoolReport();
/*追加各種功能給sr*/
sr = new HighScoreDecorator(sr) ;
sr = new SortDecorator(sr) ;
sr->report();
sr->sign("老四");
}