【问题标题】:Reason for using Interface than implement it later [duplicate]使用接口而不是稍后实现它的原因[重复]
【发布时间】:2014-03-20 05:53:50
【问题描述】:

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

界面:

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    
    }

为什么不直接创建一个不带接口的 carCRUDclass?

【问题讨论】:

  • 接口的一个被低估/经常被忽视的特性是,使用它们最大限度地减少对暴露子类型关系的依赖 :)

标签: java jsf jpa


【解决方案1】:

接口定义行为,实现接口的对象为每个行为提供对象特定的实现。
在您的示例中,CarDAO 是接口,假设它有两个实现者
1. HibernateCarDAO
2.MybatisCarDAO

现在,这些实现中的每一个都将提供 addCar(Car c) 和 deleteCar() 功能,允许 CarDAO 用户选择合适的实现。

我建议查看一些讨论实现命名约定的帖子。像 CarDAOImpl 这样的名字确实让这个概念变得混乱。更简洁的名称将使概念脱颖而出。

【讨论】:

    【解决方案2】:

    术语“合同”与接口一起使用。接口定义了应用程序和实现之间的“契约”。

    这是为了确保您至少必须提供与接口具有相同签名的方法。否则代码将无法编译。

    【讨论】:

      【解决方案3】:

      假设您有一个 ArrayList,并且您有一些实现 CarDAO 的类。这些类可能是 Car1、Car2 和 Car3。由于它们都实现了 CarDAO 类,它们都可以添加到前面所述的 ArrayList 中。您还可以遍历所有的 CarDAO 实现并共同调用这些方法,因为它们都继承了 CarDAO 的方法

      【讨论】:

        【解决方案4】:

        接口在任何语言中都是最有价值的,因为它可以让您完全分离接口和实现。

        客户端处理接口;他们不需要知道某事是如何完成的。

        如果您决定稍后换入新的实现,您可以在不影响客户端的情况下这样做。

        如果你用你的 CRUD 类来做这件事,你将不得不重写每个使用它的客户端。

        看看 java.sql 包——它都是接口。 JDBC 驱动程序供应商提供了实现,因此您不必担心供应商。如果您交换数据库,您只需在 CLASSPATH 中放置一个新的 JAR。您处理接口的所有代码仍然有效。

        另一个很好的例子是 java.util Collections API。您应该更喜欢接口 java.util.List。它背后是 ArrayList 还是 LinkedList 对您的客户来说并不重要。

        这是动态代理生成、面向方面编程、模拟等各种东西的基础。除非您了解如何很好地使用接口,否则您不能认为自己是面向对象的开发人员。

        【讨论】:

        • 但是如果我必须添加一个新的 CRUD,我的例子,它没有“update()”功能,如果我必须添加这个功能,我必须在 DAO 中添加它,并且daoimplements,双重工作,客户端现在永远不会这样,它在应用程序的“后端”中,为什么我要隐藏客户端屏幕上从来没有的东西,我不明白这一点=/如果我必须添加一个新功能,我仍然需要编辑每个客户端中的 dao 和 daoimplements,它不是“自动”
        • “双重工作”?如果界面稳定,我给出的示例当然是 auto 。这不是双重工作,因为无论您是否使用该界面,您仍然必须在每个客户端中更改它;界面只是意味着您将它再次添加到界面中。无论如何,不​​要效仿 Java 本身的设计者,按照自己的方式去做。你比他们聪明得多。
        【解决方案5】:

        因为CarDAO 的实现可能不止一种。将在编译时或运行时选择一个。

        另一个原因是让调用者不知道正在使用哪个实现。今天可能是 JPA 实现,明天可能是 MongoDB 实现。客户不需要改变。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-05-05
          • 2011-09-12
          • 1970-01-01
          • 1970-01-01
          • 2023-01-23
          • 1970-01-01
          相关资源
          最近更新 更多