您的位置:首页 > 其它

装饰模式

2016-03-11 14:18 253 查看
写好的代码就是为了以后少写一些代码。

一个班级有好多学生,学生的任务就是学习知识。而还有一些事情是需要学生来完成的:收发作业,组织活动,完成黑板报等工作。所以也就出来了一个个的职务:班长、课代表、团支书和文娱委员等等。假如我们有一个学生类,班长、课代表等是职务,不能让每个学生类都支持班长和课代表的接口吧?而且一段时间内是课代表,可能下学期就重新选择课代表了。这样怎么处理呢?又出来一个值日生,天天轮流更换,这样的情况又怎么处理呢?装饰模式提供了一个附加职责的方式来解决类似的问题。

下面的示例代码演示了学生和值日生的交互关系。同样适用于班长、课代表等。

C++代码:

#pragma once
#include <string>
using namespace std;

class 学生
{
public:
学生();
virtual ~学生();
virtual string 报名() = 0;
};

#pragma once
#include "学生.h"
class 学生张三 :
public 学生
{
public:
学生张三();
virtual ~学生张三();
string 报名();
};

#pragma once
#include "学生.h"
class 学生李四 :
public 学生
{
public:
学生李四();
virtual ~学生李四();

string 报名();
};

#pragma once
#include "学生.h"
class 值日学生 :
public 学生
{
public:
值日学生();
virtual ~值日学生();
virtual void 值日() = 0;
};

#pragma once
#include "值日学生.h"
#include "学生.h"
class 今日值日学生 :
public 值日学生
{
public:
今日值日学生(学生* s);
virtual ~今日值日学生();
string 报名();
void 值日();
private:
学生* s;
};

#include "stdafx.h"
#include "今日值日学生.h"
#include <iostream>
using namespace std;

今日值日学生::今日值日学生(学生* s)
{
this->s = s;
}

今日值日学生::~今日值日学生()
{
}

string 今日值日学生::报名()
{
return s->报名();
}

void 今日值日学生::值日()
{
cout << this->报名() << "值日" << endl;
}

// 装饰模式.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "学生.h"
#include "学生张三.h"
#include "学生李四.h"
#include "值日学生.h"
#include "今日值日学生.h"

int _tmain(int argc, _TCHAR* argv[])
{
学生*zs = new 学生张三();
学生*ls = new 学生李四();
值日学生 *zrxs1 = new 今日值日学生(zs);
值日学生 *zrxs2 = new 今日值日学生(ls);
zrxs1->值日();
zrxs2->值日();
delete zrxs1;
delete zrxs2;
delete zs;
delete ls;

getchar();
return 0;
}


C#代码:

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:18
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 学生.
/// </summary>
public interface 学生
{
string 报名();
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:20
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 学生李四.
/// </summary>
public class 学生李四 : 学生
{
public 学生李四()
{
}

public string 报名()
{
return "学生李四";
}
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:19
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 学生张三.
/// </summary>
public class 学生张三 : 学生
{
public 学生张三()
{
}

public string 报名()
{
return "学生张三";
}
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:22
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 值日学生.
/// </summary>
public interface 值日学生 : 学生
{
void 值日();
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:28
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 今日值日学生.
/// </summary>
public class 今日值日学生 : 值日学生
{
private 学生 s = null;
public 今日值日学生(学生 s)
{
this.s = s;
}
public string 报名()
{
return s.报名();
}
public void 值日()
{
Console.WriteLine("{0}今天值日。", this.报名());
}
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:41
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 班长.
/// </summary>
public interface 班长 : 学生
{
void 报职务();
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:42
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
/// <summary>
/// Description of 本届班长.
/// </summary>
public class 本届班长 : 班长
{
private 学生 s = null;
public 本届班长(学生 s)
{
this.s = s;
}

public string 报名()
{
return s.报名();
}

public void 报职务()
{
Console.WriteLine("{0}的职务是班长。", this.报名());
}
}
}

/*
* 由SharpDevelop创建。
* 用户: hangba
* 日期: 2016/3/11
* 时间: 19:09
*
* 要改变这种模板请点击 工具|选项|代码编写|编辑标准头文件
*/
using System;

namespace 装饰模式
{
class Program
{
public static void Main(string[] args)
{
学生 zs = new 学生张三();
学生 ls = new 学生李四();
值日学生 zrs = new 今日值日学生(zs);
zrs.值日();
班长 bz = new 本届班长(ls);
bz.报职务();

Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: