为了账号安全,请及时绑定邮箱和手机立即绑定

“程序到接口”。什么意思?

“程序到接口”。什么意思?

回首忆惘然 2019-08-02 07:02:30
“程序到接口”。什么意思?我经常碰到这个词:程序到接口。这到底是什么意思?一个真实的设计场景将是非常感谢的。
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

简单地说,与其用这样的方式编写类,倒不如说

我依靠这具体上课来做我的工作

你用这样的方式写

我依靠任何类别那确实是这东西做我的工作。

第一个示例表示依赖于特定具体实现来完成其工作的类。从本质上讲,这并不是很灵活。

第二个示例表示写入界面..它不关心你使用什么具体的对象,它只关心它实现了某些行为。这使得类更加灵活,因为可以为它提供任意数量的具体实现来完成它的工作。

例如,特定的类可能需要执行一些日志记录。如果编写依赖于TextFileLogger的类,则该类将永远被迫将其日志记录写入文本文件。如果要更改日志记录的行为,则必须更改类本身。该类与其记录器紧密耦合。

但是,如果编写类依赖于ILogger接口,然后为类提供一个TextFileLogger,那么您将完成同样的工作,但具有更灵活的额外好处。您可以随意提供任何其他类型的ILogger,而无需更改类本身。类和它的记录器现在是松散耦合的,您的类要灵活得多。




查看完整回答
反对 回复 2019-08-03
?
慕斯王

TA贡献1864条经验 获得超2个赞

接口是相关方法的集合,它只包含这些方法的签名-而不是实际的实现。
如果一个类实现了一个接口(class Car implements IDrivable)它必须为接口中定义的所有签名提供代码。

基本例子:
你必须上汽车和自行车课。两者都实现了IDriable接口:

interface IDrivable {
    void accelerate();
    void brake();      }

class Car implements IDrivable {
   void accelerate()
   { System.out.println("Vroom"); }

   void brake()
   { System.out.println("Queeeeek");}}

class Bike implements IDrivable {
   void accelerate()
   { System.out.println("Rattle, Rattle, ..."); }

   void brake()
   { System.out.println("..."); }}

现在假设您有一个对象集合,这些对象都是“可驱动的”(它们的类都实现了IDriable):

List<IDrivable> vehicleList = new ArrayList<IDrivable>();list.add(new Car());list.add(new Car());list.add(new Bike());list.add(new Car());list.add(new Bike());list.add(new Bike());

如果您现在希望遍历该集合,则可以依赖于以下事实:该集合中的每个对象都实现了。accelerate():

for(IDrivable vehicle: vehicleList) {
  vehicle.accelerate(); //this could be a bike or a car, or anything that implements IDrivable}

通过调用该接口方法,您不是对实现进行编程,而是对接口进行编程-这是一个确保调用目标实现特定功能的契约。
使用继承可以实现相同的行为,但是从公共基类派生会导致紧密耦合,可以使用接口避免这种耦合。




查看完整回答
反对 回复 2019-08-03
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

现实世界的例子是适用的。其中之一:

对于jdbc,您使用的是java.sql.Connection..但是,每个JDBC驱动程序都提供了自己的Connection..您不需要知道任何关于特定实现的信息,因为符合Connection接口。

另一个来自Java集合框架。有一个java.util.Collection接口,它定义了sizeaddremove方法(包括许多其他方法)。所以您可以使用所有类型的集合。互换性..假设您有以下内容:

public float calculateCoefficient(Collection collection) {
    return collection.size() * something / somethingElse;}

还有另外两种调用这个方法的方法。其他方法之一使用LinkedList因为它对其用途更有效,而另一个则使用TreeSet.

因为两个LinkedListTreeSet实现Collection接口时,只能使用一种方法来执行系数计算。不需要重复你的代码。

接下来是“程序到接口”-您不关心size()方法实现,您知道它应该返回集合的大小-即,您已将其编程到Collection接口,而不是LinkedListTreeSet特别是。

但我的建议是找到一本阅读-也许是一本书(例如,“Java中的思考”)-在这本书中详细解释这个概念。




查看完整回答
反对 回复 2019-08-03
  • 3 回答
  • 0 关注
  • 393 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信