模式學習之裝飾模式

  昨天木有事做,於是去民大的圖書館借了本《設計模式之禪》來看,之前軟考見過組合模式和裝飾模式,覺得虛函數、多態、面向對象似乎很神奇,這些設計模式尤其產生了一些不可思議的效果。今天用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("老四");
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章