猿问

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

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

我经常碰到这个词:

程序到接口。

这到底是什么意思?一个真实的设计场景将是非常感谢的。



回首忆惘然
浏览 394回答 3
3回答

慕仙森

简单地说,与其用这样的方式编写类,倒不如说我依靠这具体上课来做我的工作你用这样的方式写我依靠任何类别那确实是这东西做我的工作。第一个示例表示依赖于特定具体实现来完成其工作的类。从本质上讲,这并不是很灵活。第二个示例表示写入界面..它不关心你使用什么具体的对象,它只关心它实现了某些行为。这使得类更加灵活,因为可以为它提供任意数量的具体实现来完成它的工作。例如,特定的类可能需要执行一些日志记录。如果编写依赖于TextFileLogger的类,则该类将永远被迫将其日志记录写入文本文件。如果要更改日志记录的行为,则必须更改类本身。该类与其记录器紧密耦合。但是,如果编写类依赖于ILogger接口,然后为类提供一个TextFileLogger,那么您将完成同样的工作,但具有更灵活的额外好处。您可以随意提供任何其他类型的ILogger,而无需更改类本身。类和它的记录器现在是松散耦合的,您的类要灵活得多。

慕斯王

接口是相关方法的集合,它只包含这些方法的签名-而不是实际的实现。如果一个类实现了一个接口(class Car implements IDrivable)它必须为接口中定义的所有签名提供代码。基本例子:你必须上汽车和自行车课。两者都实现了IDriable接口:interface&nbsp;IDrivable&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;accelerate(); &nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;brake();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}class&nbsp;Car&nbsp;implements&nbsp;IDrivable&nbsp;{ &nbsp;&nbsp;&nbsp;void&nbsp;accelerate() &nbsp;&nbsp;&nbsp;{&nbsp;System.out.println("Vroom");&nbsp;} &nbsp;&nbsp;&nbsp;void&nbsp;brake() &nbsp;&nbsp;&nbsp;{&nbsp;System.out.println("Queeeeek");}}class&nbsp;Bike&nbsp;implements&nbsp;IDrivable&nbsp;{ &nbsp;&nbsp;&nbsp;void&nbsp;accelerate() &nbsp;&nbsp;&nbsp;{&nbsp;System.out.println("Rattle,&nbsp;Rattle,&nbsp;...");&nbsp;} &nbsp;&nbsp;&nbsp;void&nbsp;brake() &nbsp;&nbsp;&nbsp;{&nbsp;System.out.println("...");&nbsp;}}现在假设您有一个对象集合,这些对象都是“可驱动的”(它们的类都实现了IDriable):List<IDrivable>&nbsp;vehicleList&nbsp;=&nbsp;new&nbsp;ArrayList<IDrivable>();list.add(new&nbsp;Car());list.add(new&nbsp;Car());list.add(new&nbsp;Bike());list.add(new&nbsp;Car());list.add(new&nbsp;Bike());list.add(new&nbsp;Bike());如果您现在希望遍历该集合,则可以依赖于以下事实:该集合中的每个对象都实现了。accelerate():for(IDrivable&nbsp;vehicle:&nbsp;vehicleList)&nbsp;{ &nbsp;&nbsp;vehicle.accelerate();&nbsp;//this&nbsp;could&nbsp;be&nbsp;a&nbsp;bike&nbsp;or&nbsp;a&nbsp;car,&nbsp;or&nbsp;anything&nbsp;that&nbsp;implements&nbsp;IDrivable}通过调用该接口方法,您不是对实现进行编程,而是对接口进行编程-这是一个确保调用目标实现特定功能的契约。使用继承可以实现相同的行为,但是从公共基类派生会导致紧密耦合,可以使用接口避免这种耦合。

收到一只叮咚

现实世界的例子是适用的。其中之一:对于jdbc,您使用的是java.sql.Connection..但是,每个JDBC驱动程序都提供了自己的Connection..您不需要知道任何关于特定实现的信息,因为符合到Connection接口。另一个来自Java集合框架。有一个java.util.Collection接口,它定义了size,&nbsp;add和remove方法(包括许多其他方法)。所以您可以使用所有类型的集合。互换性..假设您有以下内容:public&nbsp;float&nbsp;calculateCoefficient(Collection&nbsp;collection)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;collection.size()&nbsp;*&nbsp;something&nbsp;/&nbsp;somethingElse;}还有另外两种调用这个方法的方法。其他方法之一使用LinkedList因为它对其用途更有效,而另一个则使用TreeSet.因为两个LinkedList和TreeSet实现Collection接口时,只能使用一种方法来执行系数计算。不需要重复你的代码。接下来是“程序到接口”-您不关心size()方法实现,您知道它应该返回集合的大小-即,您已将其编程到Collection接口,而不是LinkedList和TreeSet特别是。但我的建议是找到一本阅读-也许是一本书(例如,“Java中的思考”)-在这本书中详细解释这个概念。
随时随地看视频慕课网APP

相关分类

Java
我要回答