每天一个设计模式(装饰模式 -2011.4.19 星期二)期待提问和讨论
装饰模式概要
顾名思义,装饰可以简单理解为旧貌新颜。即在现有基础上通过增加以达到改变。
放到开发里就是为已有的功能动态的添加更多的功能,直白一点就是
向旧有的类灵活的添加代码,以打到改变原有类的主要行为。
装饰模式的特点是新加入的东西只是为了满足一些在特定情况下才会执行的特殊行为,
把每个需要灵活使用的功能放在单独的类中,并让这个类包装他所要装饰的类,
等出现需要执行特定行为的时候,客户代码就可以在运行时根据需要灵活的有选择,有顺序的使用指定装饰类去包装对象。
因为昨天的帖子有同修提出了一个关于工资的需求,所以用装饰模式按他的需求实现了一个简单的程序结构
至于实际功能肯定是没有精力去仔细分析你的工资规则而给出完整的功能性代码,毕竟我开这贴想探讨的是如果通过
前人提出的一些方法使自己的程序能拥有一个更利于维护和扩展的结构
考虑到很多人看代码困难或不愿意细看,所以为了直观一点,代码的变量都用了中文,实际开发中这非常不可取,切勿模仿
namespace 装饰模式{ class 员工 { public string 员工姓名; public double 基本工资 = 0; public double 出勤 = 0; public double 清凉 = 0; public double 水电 = 0; public 员工() { } public 员工(string 员工姓名) { this.员工姓名 = 员工姓名; } public virtual string 显示() { return 员工姓名; } } class 工资:员工 { protected 员工 员工类型变量; public void 装饰(员工 员工类型变量) { this.员工类型变量 = 员工类型变量; } public override string 显示() { if (this.员工类型变量 != null) { return this.员工类型变量.显示(); } return ""; } } class 基础工资 : 工资 { public override string 显示() { 基本工资 = 3200; return base.显示()+"\n基本工资:"+基本工资; } } class 出勤奖:工资 { public override string 显示() { 出勤 = 500; return base.显示() + "\n出勤:" + 出勤; } } class 清凉补贴:工资 { public override string 显示() { 清凉 = 400; return base.显示() + "\n清凉:" + 清凉; } } class 水电扣除:工资 { public override string 显示() { 水电 = 300; return base.显示() + "\n水电:" + 水电; } }}
namespace 装饰模式{ class Program { static void Main(string[] args) { 员工 员工一 = new 员工("周润发"); 基础工资 基础 = new 基础工资(); 出勤奖 出勤 = new 出勤奖(); 清凉补贴 清凉 = new 清凉补贴(); 水电扣除 水电 = new 水电扣除(); 基础.装饰(员工一); 出勤.装饰(基础); 清凉.装饰(出勤); 水电.装饰(清凉); Console.WriteLine(水电.显示()); Console.Read(); } }}