public interface iUserInfo
{
string getUserName(int userId);
string getUserAge(string username);
}
public class UserDb implements iUserInfo
{
string getUserName(int userId)
{
//code to retrieve user info from the database
}
}
public class UserTxtFile implements iUserInfo
{
string getUserName(int userId)
{
//code to retrieve user info from the plain text file
}
}
public class UserManager()
{
private iUserInfo userInfo;
public string retrieveUserData(string userName)
{
return userInfo.getUserAge(userName);
}
}
我的教授说
“上面的用户管理器类有一个 iUserInfo 类型的引用变量,因此,如果这个引用是由工厂方法或任何其他方式提供的,那么无论提供什么实现,管理器类的代码都是相同的。
如果在软件开发过程中需要更改某些实现,这种方法可以最大限度地提高灵活性,因为更高级别的层根本不会受到影响。”
我需要了解两件事;灵活性最大化和工厂方法。
后者我猜它可能是这样的
public class UserManager()
{
private iUserInfo userInfo;
private UserTxtFile uTxtFile;
private UserDb uDB;
public iUserInfo GetUserInfoObjFactory(bool dbOrTxt)
{
return dbOrTxt? uTxtFile:uDB;
}
public string retrieveUserData(string userName)
{
return userInfo.getUserAge(userName);
}
}
在讲座期间,我有点做白日梦,现在不知道这到底是什么意思?我很想更深入地了解一下,以防一些面试官可能会用我不确定如何回答的更开放的问题来攻击我。
当高层受到影响时,您是否还可以添加一些代码来破坏上述源代码?十分感谢。
[更新]我还发现诸如“我们需要接口来分组常用方法”之类的答案并不令人信服。单独的抽象基类也有帮助。例如,来自 2 个对象 {Penguin vs Bird} 的 Fly 行为。我不能简单地告诉面试官根本需要 IFly。即使我有数百万个需要 Fly 的不同对象,我也总是可以为每个对象实现每个 Fly。因为即使我设计了 IFly,我仍然需要在实现类中这样做。请您提供更详细的案例或重新解释接口如何成为必须的?