【问题标题】:Is that a good usage of the decorator pattern?这是装饰器模式的一个很好的用法吗?
【发布时间】:2011-07-20 06:38:42
【问题描述】:

我必须为客户编写 2 个文本文件。这些文件包含来自我们数据库的信息。许多客户正在使用我们的应用程序,因此不会为每个客户编写这两个文件。有些只是获得第一个文件,有些还获得第二个文件。文件结构因客户而异,这就是为什么我使用抽象方法 Write 制作了一个抽象类,并为每个客户创建了一个特定的类,该类覆盖了 Write 方法。这是第一个针对所有客户的文件,只是内容和结构不同。

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

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

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

谢谢:-)

【问题讨论】:

    标签: c# design-patterns decorator


    【解决方案1】:

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

    适配器看起来像这样:

    public SecondWriterAdapter : CustomerWriter
    {
        private SecondWriter writerInstance;
        public SecondWriterAdapter(SecondWriter writerInstance)
        {
            this.writerInstance = writerInstance;
        }
    
        public override void Write()
        {
            writerInstance.someExistingWriteMethod();
        } 
    }
    

    【讨论】:

      【解决方案2】:

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

      更新:您可以为此使用 IoC 容器,但很简单

      public class FileWriterRegistry
      {
         public void Register(CustomerWriter writer)
         {
         }
      
         public void WriteAllFiles()
         {
             ... call Write() for each registered writer
         }
      }
      

      可能会。

      【讨论】:

      • 可能会,但我在上面添加了第二个文件,我有另一个基类......它不是 CustomerWriter。
      • 但它给了我一个想法......我可以只做第二个。如果这可以在我的配置文件中进行配置,那就太好了……有没有一种通用的方法可以做到这一点?
      • 那么,为什么您的第二个文件的编写器具有不同的基类是有原因的吗?第二个概念有区别吗?如果您需要另一个基类(无论出于何种原因),那么您可以考虑为您的所有编写器引入一个 ICustomerWriter 接口。至于配置文件:我认为没有通用的方法。如果您使用 IoC 容器,那么这些容器通常支持某种 xml 配置,但您可能只需在配置中添加一些设置,以便选择所有适用的编写器。
      猜你喜欢
      • 2011-02-17
      • 1970-01-01
      • 2015-03-27
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      相关资源
      最近更新 更多