我试图通过"程序到界面来理解它的含义"在Java中

时间:2018-04-07 20:44:57

标签: java data-structures

我试图了解它的含义"编程到界面"在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行有什么问题。有人可以解释一个用例,由于编码实现会将这个例子运行成一个问题吗?**

1 个答案:

答案 0 :(得分:0)

想象一下,您有一个CLI程序和服务器都使用的库。 该库使用的缓存只是键值对的映射。

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

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

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

关于15/16号线

你可以拥有一个由2个网站使用的wiki系统,一个是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);
}