我试图理解 Java 中"Program to an interface"的含义



我试图理解Java中"编程到接口"的含义。我们是否应该编程为接口,因为不断变化的客户需求。这是唯一的原因吗

下面的程序将如何遇到客户端和开发人员感知的问题?

public interface SuperHeros {
public List<String> getCharacters();
}
public class DCSuperHeros implements SuperHeros {
List<String> characters = List.of("Super Man", "Bat Man", "Wonder Woman", "Cyborg", "Flash");
public List<String> getCharacters() {
return characters;
}
}
public class MarvelSuperHeros implements SuperHeros {
List<String> characters = List.of("Spider Man", "Captain America", "Daredevil", "Wolverine", "Iron Man");
public List<String> getCharacters() {
return characters;
}
}
**SuperHeros marvelHeros = new MarvelSuperHeros(); //Line 15
SuperHeros dcHeros = new DCSuperHeros(); //Line 16

15号线和16号线有什么问题。有人可以用一个用例来解释一下,由于编码到实现,这个用例会让这个例子出现问题吗?

假设您有一个 CLI 程序和服务器都使用的库。 此库使用的缓存只是键值对的映射。

您希望库使用的接口是 Map,因为对于 CLI 程序,您可能可以使用 HashMap,但对于服务器,您可能希望使用 ConcurrentHashMap 来确保线程安全。您使用的实现将在运行时注入。您甚至可能想要使用 Redis 实现。

另一个类似的例子是管理数据存储库的库。您可能需要一个使用 AWS 或 Azure 存储的实现,以及一个使用 MongoDB 或 SQL 的实现。您可能希望该库向使用它的程序提供相同的接口,并允许在运行时选择使用的实现。

或者对于不那么无聊的东西,想象一下你正在编写超级马里奥兄弟2。您可以选择 4 个角色:马里奥、路易吉、桃子公主和蟾蜍。当您按下方向键或 A 或 B 按钮时,每个按钮的行为都略有不同,但它们都具有相同的界面。

关于15/16号线

你可以有一个由两个网站使用的维基系统,一个是DC,一个是奇迹。

两者使用的类将采用接口

SuperHeros marvelHeros = new MarvelSuperHeros(); //Line 15
SuperHeros dcHeros = new DCSuperHeros(); //Line 16
SuperHeroDataBase marvelDataBase = new SuperHeroDataBase(marvelHeros);
// these aren't necessarily in the same program, could be 2 totally different server programs that use the same library
SuperHeroDataBase dcDataBase = new SuperHeroDataBase(dcDataBase);

与 SuperHeroDataBase 的 ctor 一起:

public SuperHeroDataBase(SuperHeros superHeros){
this.superHeros = superHeros);
}

相关内容

最新更新