我是 jsf 和 spring 概念的新手。
我有一个 xhtml 页面,可以访问 bean 类中的自定义方法。
我使用了 Delegate(服务类)和 Dao 类。
我的问题是来自bean类我应该调用委托接口方法还是委托实现方法?
项目结构如下:
- xhtml 页面
- bean抽象类
- bean实现类(扩展自bean抽象类)
- 委托接口类
- 委托实现类
- dao接口类
- dao实现类
我是 jsf 和 spring 概念的新手。
我有一个 xhtml 页面,可以访问 bean 类中的自定义方法。
我使用了 Delegate(服务类)和 Dao 类。
我的问题是来自bean类我应该调用委托接口方法还是委托实现方法?
项目结构如下:
我应该调用委托接口方法还是委托实现方法?
您当然可以两者都做,但是依靠接口可以避免对象之间的紧密耦合。
将接口视为一般合同,将其具体实现视为包含合同所有细节的实例。
你可以想象一个简单的案例,那就是合同服务。您可以编写一个接口,强制所有实现只遵循一种方法:getAllContacts
. 所以你的界面将是:
public interface ContactBookInterface {
public List<Contact> getAllContacts ();
}
Interface 并不关心数据如何在内部存储或数据来自何处等细节。所有这些细节都存在于实现中。您可以考虑两种实现:
public class ContactBookService implements ContactBookInterface {
private ContactDAO contactDAO;
...
public List<Contact> getAllContacts() {
return contactDAO.findAll();
}
}
和
public class ContactBookMockService implements ContactBookInterface {
private List<Contact> contacts;
public ContactBookMockService() {
contacts = populateMockContacts();
}
...
public List<Contact> getAllContacts() {
return contacts;
}
}
现在,从程序的角度来看,您可以拥有以下托管 bean:
@ManagedBean
...
public void ContactsBean {
private ContactBookInterface cbi;
...
}
有了这样的设计,具体的实现并不重要,将通过正确的依赖注入来处理。重要的是要注意,您不会使用这种方法将自己束缚于实现设计,并且您可以轻松地用新的实现替换您的实现,因为您的代码是松散耦合的。