装饰者模式:动态地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式比生成子类更为灵活。
参与类或接口作用
ConcreteComponent:让Decorator对象为自己添加功能。有时候使用ConcreteComponent的派生类提供核心功能,在这种情况就是用ConcreteComponent替代了Component的功能,而且装饰者是继承于ConcreteComponent的子类。
Component:定义ConcreteComponent和Decorator类要实现的方法,简单来说如果一个类继承于该类就具有装饰或被装饰能力。
Decorator:具有特定装饰功能的类,用来装饰ConcreteComponent类。
代码故事:小学上学都有成绩单,有成绩单就要求有家长签字。考好了一切没问题,如果考差了,还敢让家长签字么?这个时候就要想个办法了:要装饰一下我们的成绩单,让家长看起来这个成绩还不错。具体代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WCF_Binding
{
//抽象成绩单
public abstract class SchoolReport
{
//成绩单主要展示的就是你的成绩情况
public abstract void report();
//成绩单要家长签字,这个是最要命的
public abstract void sign(String name);
}
//四年级成绩单
public class FouthGradeSchoolReport : SchoolReport
{
//我的成绩单
public override void report()
{
//成绩单的格式是这个样子的
Console.Write("尊敬的XXX家长:");
Console.Write(" ......");
Console.Write(" 语文 62 数学65 体育 98 自然 63");
Console.Write(" .......");
Console.Write(" 家长签名: ");
}
//家长签名
public override void sign(String name)
{
Console.Write("家长签名为:" + name);
}
}
//修饰的抽象类
public abstract class Decorator : SchoolReport
{
//首先我要知道是哪个成绩单
private SchoolReport sr;
//构造函数,传递成绩单过来
public Decorator(SchoolReport sr)
{
this.sr = sr;
}
//成绩单还是要被看到的
public override void report()
{
this.sr.report();
}
//看完还是要签名的
public override void sign(String name)
{
this.sr.sign(name);
}
}
//最高成绩修饰
public class HighScoreDecorator : Decorator
{
//构造函数
public HighScoreDecorator(SchoolReport sr):base(sr)
{
}
//我要汇报最高成绩
private void reportHighScore()
{
Console.Write("这次考试语文最高是75,数学是78,自然是80");
}
//我要在老爸看成绩单前告诉他最高成绩,否则等他一看,就抡起扫帚揍我,我哪里还有机会说啊
public override void report()
{
this.reportHighScore();
base.report();
}
}
//排名情况修饰
public class SortDecorator : Decorator
{
//构造函数
public SortDecorator(SchoolReport sr):base(sr)
{
}
//告诉老爸学校的排名情况
private void reportSort()
{
Console.Write("我是排名第38名...");
}
//老爸看完成绩单后再告诉他,加强作用
public override void report()
{
base.report();
this.reportSort();
}
}
public class Father
{
public static void main(String[] args)
{
//把成绩单拿过来
SchoolReport sr;
//原装的成绩单
sr = new FouthGradeSchoolReport();
//加了最高分说明的成绩单
sr = new HighScoreDecorator(sr);
//又加了成绩排名的说明
sr = new SortDecorator(sr);
//看成绩单
sr.report();
//然后老爸一看,很开心,就签名了
sr.sign("老三"); //我叫小三,老爸当然叫老三
}
}
}