您的位置:首页 > 其它

Decorator Pattern(装饰模式)

2014-04-07 13:01 148 查看
装饰模式:动态的给一个对象添加一些额外的职责。当然我们也可以通过继承来实现类似的功能,但是随着子类的增多,各种子类的组合会造成子类的急剧膨胀。

Requirement:

  假设客户有一个要求,需要打一个report,并且report 的header 和footer 各有3种,然后要求打出所有可能组合的report。

Analysis:

  当然纯粹的通过子类继承也可以实现,但是现在如果header 和footer各有10种呢,那么你就要有100个扩展类。但是通过使用装饰模式,你只要10 header 类+10个footer类(即20个类)就可以轻松搞定。下面我们以header 和footer 各有两个具体实现一下。

Sample Code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestDecoratorPatternSample
{
public abstract class Report
{
public abstract void ReportContent();
}

public class Content : Report
{
public override void ReportContent()
{
Console.WriteLine("This is report content.");
}
}

public abstract class ReportDecorator : Report
{
private Report report;
public ReportDecorator(Report myReport)
{
report = myReport;
}
public override void ReportContent()
{
report.ReportContent();
}
}
#region Header1
public class Header1 : ReportDecorator
{
public Header1(Report myReport)
: base(myReport)
{
}

public override void ReportContent()
{
ReportHeader();
base.ReportContent();
}

public void ReportHeader()
{
Console.WriteLine("This is report header1.");
}
}

#endregion
#region Header2

public class Header2 : ReportDecorator
{
public Header2(Report myReport)
: base(myReport)
{
}

public override void ReportContent()
{
ReportHeader();
base.ReportContent();
}

public void ReportHeader()
{
Console.WriteLine("This is report header2.");
}
}

#endregion
#region Header3

public class Header3 : ReportDecorator
{
public Header3(Report myReport)
: base(myReport)
{
}

public override void ReportContent()
{
ReportHeader();
base.ReportContent();
}

public void ReportHeader()
{
Console.WriteLine("This is report header3.");
}
}

#endregion
#region Footer1
public class Footer1 : ReportDecorator
{
public Footer1(Report myReport)
: base(myReport)
{
}

public override void ReportContent()
{
base.ReportContent();
ReportFooter();
}

public void ReportFooter()
{
Console.WriteLine("This is report Footer1.");
}
}
#endregion
#region Footer2

public class Footer2 : ReportDecorator
{
public Footer2(Report myReport)
: base(myReport)
{
}

public override void ReportContent()
{
base.ReportContent();
ReportFooter();
}

public void ReportFooter()
{
Console.WriteLine("This is report Footer2.");
}
}

#endregion
#region Footer3

public class Footer3 : ReportDecorator
{
public Footer3(Report myReport)
: base(myReport)
{
}

public override void ReportContent()
{
base.ReportContent();
ReportFooter();
}

public void ReportFooter()
{
Console.WriteLine("This is report Footer3.");
}
}

#endregion
}


  下面是客户端的调用代码,你需要怎么组合在你调用的时候就怎么组合。

Content clientReport = new Content();
Report header2 = new Header2(clientReport);
Report footer1 = new Footer1(header2);
footer1.ReportContent();


  

欢迎各位网友拍砖,本人也在不断学习中。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: