Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 这个设计图案的名字是什么?_Oop_Design Patterns - Fatal编程技术网

Oop 这个设计图案的名字是什么?

Oop 这个设计图案的名字是什么?,oop,design-patterns,Oop,Design Patterns,假设我需要将应用程序中的文本保存到一个文件中,但允许用户使用多种格式的.pdf、.word、.txt、。。。选择 第一种方法可以是: if (extension == ".pdf") ExportToPdf(file); else if (extension == ".txt") ExportToTxt(file); ... 但我通常会这样封装上面的内容: abstract class Writer { abstract bool CanWriteTo(string file);

假设我需要将应用程序中的文本保存到一个文件中,但允许用户使用多种格式的.pdf、.word、.txt、。。。选择

第一种方法可以是:

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继承的新类,并实现CanWriteTo。。然后写。。方法,并将新的writer添加到WritersHandler中的writer列表中,可能会添加AddWriter w方法或手动添加,但这不是现在的重点

我也在其他情况下使用这个

我的问题是:

这个图案叫什么名字?也许这是一种模式的修改,我不知道。

这是一种模式。
它基本上定义了一个处理对象链,如果当前处理对象无法处理,则将提供的命令传递给下一个处理对象

我会做得和你不一样

主要区别在于存储处理程序和选择正确处理程序的方式。 事实上,我认为责任链在这里是一个糟糕的选择。此外,如果有更多的处理程序,则遍历处理程序列表可能会非常耗时。字典提供O1编写器检索。 如果我猜的话,我会说我的模式叫做策略

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);
  }
}

非常感谢你的回答。这似乎是一种模式,但只是一个修改版本,没有对象的链接列表,而是有一个包含所有对象的列表。你认为我应该像现在一样使用它,还是使用sucessor的原始模式,等等?也许我应该把它作为一个新问题发布在这里。我认为这是这种操作的完美模式。我还记得,处理不同的文件类型是该模式常用的示例之一。你用它就可以了。对于发现文件处理程序,也有一些模式,但这是另一个主题再次感谢你的回答。这不是真正的不负责任。它只是意外地编码为if-else链。如果他使用字典从文件扩展名中选择处理程序,那么就没有链;D So:他的设计的核心是将特定文件格式的编写隔离到WriterHandler类中。即:战略;D所以。。。即使他把一个测试放在它前面的链条上,它仍然不是指挥链。正如在CoC中一样,作者管理员将决定他是否能写作,如果不能,他将调用链中的下一个。以CoC模式。。。。。。你从外面不知道有锁链,你说得对。这似乎更多的是战略模式,而不是责任链,尽管设计并不完全相同。拉尔夫·约翰逊说:战略要么由外部代理人选择,要么由环境选择。在这种情况下,要使用的“策略”由上下文选择。