这是装饰模式的一个很好的用法吗?

时间:2011-03-22 07:41:29

标签: c# design-patterns decorator

我必须为客户写2个文本文件。这些文件包含来自我们DB的信息。我们的应用程序正被许多客户使用,因此不会为每个客户编写这两个文件。有些只是获得第一个文件,有些只是第二个文件。文件结构因客户而异,这就是为什么我使用抽象方法 Write 创建一个抽象类,并为每个客户创建一个特定的类来解决Write方法。这是第一个适用于所有客户的文件,只是具有不同的内容和结构。

abstract class CustomerWriter
{
    //...
    abstract Write();
    //...  
}

然后我有2个继承自那个的类。多数民众赞成我猜。现在为第二个只需要为某些客户编写的文件......在这里使用装饰器模式并为第一个文件装饰类是个好主意吗?它不是同一个基类(CustomerWriter)。我不确定这对我的情况来说是否太多了,这就是我要问的原因。

我如何为第一个文件装饰特定的类?

谢谢: - )

2 个答案:

答案 0 :(得分:0)

如何根据客户配置在某处注册所有允许的文件编写器,然后执行所有已注册的编写器?

更新:您可以使用IoC容器,但只需一个简单的

public class FileWriterRegistry
{
   public void Register(CustomerWriter writer)
   {
   }

   public void WriteAllFiles()
   {
       ... call Write() for each registered writer
   }
}

可能会这样做。

答案 1 :(得分:0)

如果您无法重构第二个编写器以共享公共基类或接口,您可能实际上想要使用适配器模式。您可以编写一个适配器,使第二个编写器看起来像CustomerWriter。这样,您的客户端可以使用一个公共基类或接口(甚至更好)。然后,您可以使用IoC容器来配置客户端实例化的实例。

适配器看起来像这样:

public SecondWriterAdapter : CustomerWriter
{
    private SecondWriter writerInstance;
    public SecondWriterAdapter(SecondWriter writerInstance)
    {
        this.writerInstance = writerInstance;
    }

    public override void Write()
    {
        writerInstance.someExistingWriteMethod();
    } 
}