我的问题是:为什么人们会这样做:
接口:
public interface CarDAO {
void addCar(Car car);
List<Car> readAll();
void deleteCar(Long id);
}
而不是创建一个实现carDAO的类
public class CarDAOImpl implements CarDAO {
private SessionFactory sessionFactory;
private Session getCurrentSession(){
return sessionFactory.getCurrentSession();
}
public void addCar(Car car) {
all the code to add the car
}
public void deleteCar(Car car) {
all the code to delete the car
}
为什么不在没有界面的情况下创建汽车CRUD类?
答案 0 :(得分:3)
接口在任何语言中都是最有价值的,因为您可以完全分离接口和实现。
客户端处理接口;他们不需要知道是怎么做的。
如果您决定稍后交换新的实施,则可以在不影响客户的情况下进行。
如果您使用CRUD类,则必须重写每个使用它的客户端。
查看java.sql包 - 它是所有接口。 JDBC驱动程序供应商提供实现,因此您不必担心供应商。如果交换数据库,只需在CLASSPATH中添加一个新的JAR即可。您处理接口的所有代码仍然有效。
另一个很好的例子是java.util Collections API。您应该更喜欢接口java.util.List。它后面的ArrayList或LinkedList是否对您的客户无关紧要。
这是动态代理生成,面向方面编程,模拟,各种东西的基础。除非您了解如何正确使用接口,否则您不能将自己视为面向对象的开发人员。
答案 1 :(得分:0)
因为CarDAO
可能有多个实现。一个将在编译时或运行时选择。
另一个原因是抽象调用者知道正在使用哪个实现。可能是今天的JPA实现,可能是明天的MongoDB实现。客户不需要改变。
答案 2 :(得分:0)
假设您有一个ArrayList,并且您有一些实现CarDAO的类。这些类可以是Car1,Car2和Car3。由于它们都实现了CarDAO类,因此它们都可以添加到之前声明的ArrayList中。您也可以遍历所有CarDAO实现并调用这些方法,因为它们都继承了CarDAO的方法
答案 3 :(得分:0)
术语“合同”与接口一起使用。界面定义了应用程序和实现之间的“契约”。
这是为了确保至少您必须提供与接口具有相同签名的方法。否则代码将无法编译。
答案 4 :(得分:0)
接口定义行为,实现接口的对象为每个行为提供特定于对象的实现
在您的示例中,CarDAO是界面,假设它有两个实现者
1. HibernateCarDAO
2. MybatisCarDAO
现在,每个实现都将提供addCar(Car c)和deleteCar()功能,允许CarDAO的用户选择适当的实现。
我建议查看一些讨论实现命名约定的帖子。像CarDAOImpl这样的名字确实让这个概念变得混乱。更清晰的名字将使这个概念脱颖而出。