这个设计模式的名称是什么?

时间:2011-02-16 07:09:46

标签: oop design-patterns

我们假设我需要将应用程序中的文本保存到文件中,但允许用户使用多种格式(.pdf.word.txt,{{1 }})选择。

第一种方法可能是:

...

但我通常将上述内容封装起来:

if (extension == ".pdf")
  ExportToPdf(file);
else if (extension == ".txt")
  ExportToTxt(file);
...

使用它,如果我需要添加新的扩展/格式,我所要做的就是为该编写器创建一个新类(继承自abstract class Writer { abstract bool CanWriteTo(string file); abstract void Write(string text, string file); } class WritersHandler { List<Writer> _writers = ... //All writers here public void Write(string text, string file) { foreach (var writer in _writers) { if (writer.CanWriteTo(file) { writer.Write(text, file); return; { } throw new Exception("..."); } } )并实现Writer和{ {1}}方法,并将新编写器添加到CanWriteTo(..)中的编写器列表中(可能手动添加方法Write(..),但现在不是重点)。

我也在其他情况下使用它。

我的问题是:

这个模式的名称是什么?(也许这是对模式的修改,不知道)。

2 个答案:

答案 0 :(得分:5)

这是Chain Of Responsibility 它基本上定义了一系列处理对象,如果当前的处理对象无法处理它,则将提供的命令传递给下一个处理对象。

答案 1 :(得分:1)

我会比你做的有点不同。

主要区别在于存储处理程序和选择正确的处理程序的方式。 事实上,我认为责任链在这里是一个糟糕的选择。此外,遍历处理程序的ist可能是耗时的(如果有更多的那些)。 Dictionary提供O(1)编写器检索。 如果我猜测我会说我的模式叫做策略。

abstract class Writer
{
  abstract string SupportedExtension {get;}
  abstract void Write(string text, string file);
}

class WritersHandler
{
  Dictionary<string,Writer> _writersByExtension = ... //All writers here

  public void Init(IEnumerable<Writer> writers)
  {
     foreach ( var writer in writers )
     {
        _writersByExtension.Add( writer.SupportedExtension, writer );
     }
  }

  public void Write(string text, string file) 
  {
    Writer w = _writersByExtension.TryGetValue( GetExtension(file) );
    if (w == null)
    {
       throw new Exception("...");
    }
    w.Write(text, file);
  }
}
相关问题