Oop 这个设计图案的名字是什么?
假设我需要将应用程序中的文本保存到一个文件中,但允许用户使用多种格式的.pdf、.word、.txt、。。。选择 第一种方法可以是: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);
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模式。。。。。。你从外面不知道有锁链,你说得对。这似乎更多的是战略模式,而不是责任链,尽管设计并不完全相同。拉尔夫·约翰逊说:战略要么由外部代理人选择,要么由环境选择。在这种情况下,要使用的“策略”由上下文选择。