我目前工作的東西我的世界,而我使用橋接模式,所以我的代碼可以使用兩個獨立的服務器平臺,海綿和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'的正確實現。 –