装饰模式
2016-03-11 14:18
253 查看
写好的代码就是为了以后少写一些代码。
一个班级有好多学生,学生的任务就是学习知识。而还有一些事情是需要学生来完成的:收发作业,组织活动,完成黑板报等工作。所以也就出来了一个个的职务:班长、课代表、团支书和文娱委员等等。假如我们有一个学生类,班长、课代表等是职务,不能让每个学生类都支持班长和课代表的接口吧?而且一段时间内是课代表,可能下学期就重新选择课代表了。这样怎么处理呢?又出来一个值日生,天天轮流更换,这样的情况又怎么处理呢?装饰模式提供了一个附加职责的方式来解决类似的问题。
下面的示例代码演示了学生和值日生的交互关系。同样适用于班长、课代表等。
C++代码:
C#代码:
一个班级有好多学生,学生的任务就是学习知识。而还有一些事情是需要学生来完成的:收发作业,组织活动,完成黑板报等工作。所以也就出来了一个个的职务:班长、课代表、团支书和文娱委员等等。假如我们有一个学生类,班长、课代表等是职务,不能让每个学生类都支持班长和课代表的接口吧?而且一段时间内是课代表,可能下学期就重新选择课代表了。这样怎么处理呢?又出来一个值日生,天天轮流更换,这样的情况又怎么处理呢?装饰模式提供了一个附加职责的方式来解决类似的问题。
下面的示例代码演示了学生和值日生的交互关系。同样适用于班长、课代表等。
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); } } }
相关文章推荐
- lua 函数
- 查看 linux内核版本
- Grunt使用教程(限winows)
- 模拟障碍--14
- OnGlobalLayoutListener获得一个视图的高度
- win7系统开机出现Recovery英文无法启动的解决方法
- AsyncTask学习记录
- online_judge_1391
- nodejs 读取文件中的几行
- javascript Date format(js日期格式化)
- 数据结构与算法面试题80道(16)
- 免费馅饼
- PYTHONIOENCODING 乱码相关
- Exception in thread "main" java.lang.UnsupportedClassVersionError: testAnnotation1/FruitRun : Unsupp
- 按两下退出APP代码
- 寻找空洞
- 寻找空洞
- Apach配置本地仿服务器连接
- Starting MySQL.Manager of pid-file quit without updating file.[FAILED]
- 自定义view,跟随手指滑动的圆球