使用Interface的原因比以后实现它

时间:2014-02-19 17:47:26

标签: java jsf jpa

我的问题是:为什么人们会这样做:

接口:

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类?

5 个答案:

答案 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这样的名字确实让这个概念变得混乱。更清晰的名字将使这个概念脱颖而出。