模式学习之装饰模式

  昨天木有事做,于是去民大的图书馆借了本《设计模式之禅》来看,之前软考见过组合模式和装饰模式,觉得虚函数、多态、面向对象似乎很神奇,这些设计模式尤其产生了一些不可思议的效果。今天用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("老四");
}
 

你可能感兴趣的:(C++,装饰模式)