我们假设我需要将应用程序中的文本保存到文件中,但允许用户使用多种格式(.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(..)
,但现在不是重点)。
我也在其他情况下使用它。
我的问题是:
这个模式的名称是什么?(也许这是对模式的修改,不知道)。
答案 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);
}
}