我创建了以下界面:
public interface IReader
{
string Read();
}
它的一个实现是XmlFileReader,它根据存储在配置文件中的路径封装从磁盘读取xml文件的逻辑。
它的另一个实现是FileReader,它将根据指定为参数的路径从磁盘读取文件。
现在令人困惑的是,XMLFileReader并不需要Read()方法中的任何参数,而FileReader则需要。我应该向IReader.Read()方法添加一个可选参数,这样在FileReader的情况下我可以使用参数提供文件路径,而在XMLFileReader的情况下,不会使用该参数吗?
另一种选择可能是使用带有参数的Read()方法创建一个单独的接口。
这种情况的优秀设计是什么?
答案 0 :(得分:1)
规范解决方案是将参数放在具体类的构造函数中。
那就是说,我不认为你的设计是合理的:什么会返回XmlReader.Read
方法?请记住,界面的用户应该忽略它使用的具体类。因此,在调用IReader.Read()
之后,它不应该根据文件的类型对字符串做不同的详细说明。这是你的情况吗?
在我看来,你想要捕捉的变化不是"阅读文件"部分,但"如何获得正确的文件阅读"。在这种情况下,接口带有" Read"方法没用。
在任何情况下:IReader
,XmlFileReader
和FileReader
都是您班级的错误名称。你应该避免使用-er后缀:见this good article。请记住,继承应该模拟IS-A关系。
答案 1 :(得分:0)
我认为你可以使用策略模式。它将算法隔离在单独的类中,以便能够在运行时选择不同的算法。
以下是模式的详细说明 Strategy pattern explained