我目前工作的东西我的世界,而我使用桥接模式,所以我的代码可以使用两个独立的服务器平台,海绵和Bukkit,不同(但有点类似于使用)API的。造成太多的仿制药大桥设计模式
我有我的核心代码,这仅取决于在我的世界共同的东西,我稍后需要的,比如玩家和物品,以及抽象工厂和制造商类抽象。特定服务器平台的代码将实现工厂和构建器,并将它们作为依赖关系提供给核心代码。
这一直工作得很好,到目前为止,但我遇到了一个问题,与互相依赖抽象。例如,我有适用于Minecraft库存的适配器和适用于我自己的抽象项目/库存类型的项目/库存类型的项目。 Item和Inventory对象需要互相交互,并且由于核心代码不知道实现,所以我使用泛型。这里有一些伪代码:
interface Item<TBase> {
TBase getBase();
}
interface Inventory<TItem extends Item<*>> {
void addItem(TItem item);
}
Item类适应服务器平台使用的项目类型中的项目。 addItem()
方法实现将使用getBase()
方法将服务器平台项目的实例添加到服务器平台的清单实例。总体而言,泛型提供了平台特定对象之间交互的解决方案。
我已经运行到这个问题,但是,仿制药越来越复杂的项目的大小增加。其中一个原因是使用商品/库存的类将需要相同的泛型。例如,所有玩家都有一个库存:
interface Player<TItem extends Item<*>> {
Inventory<TItem> getInventory();
void giveItem(TItem item);
}
而使用玩家的东西需要具有泛型等等。
的第二个问题是,有不只是这两种情况下,这可能意味着对所有使用该对象的类的对象几个泛型参数,因而更仿制药之间更多的互动。
我想另一种解决方案根本不会使用泛型,而是改变getBase()
返回Object
类型,并盲目地施放,相信它是正确的类型(它会是)。
我已经把一吨的思想到这一点,这可能是我能拿出最好的。我想知道是否有其他解决方案,我错过了,或任何设计模式,可能有助于解决这个问题。
如果具有源会有所帮助,您可以在这里找到: https://github.com/BenWoodworth/FastCraft/tree/master/src/main/kotlin/net/benwoodworth/fastcraft
为什么'Player'需要与'Item'有关的通用类? '玩家'不是'物品'。 –
我不确定如何确保'getInventory()'提供了一个'Inventory',其中包含'Item'的正确实现。 –