假設我有一個遊戲,那裏有按類型排序的建築物。每種類型都表示爲一個單獨的類,但有時我必須爲同一類型的建築物執行一些不常見的邏輯。怎麼能實現這種行爲?如何基於對象ID做邏輯
例如,我可以通過ID識別建築物,因此我可以在建築類型類中使用巨型開關或命令模式。但我認爲這種方法有些不對。
另一種方法是對任何發散邏輯都有不同的類。但是這提出了許多小類。
假設我有一個遊戲,那裏有按類型排序的建築物。每種類型都表示爲一個單獨的類,但有時我必須爲同一類型的建築物執行一些不常見的邏輯。怎麼能實現這種行爲?如何基於對象ID做邏輯
例如,我可以通過ID識別建築物,因此我可以在建築類型類中使用巨型開關或命令模式。但我認爲這種方法有些不對。
另一種方法是對任何發散邏輯都有不同的類。但是這提出了許多小類。
這是多態性旨在解決的問題,也是程序和編程之間的巨大差異之一。您可以通過擴展基類或實現接口來實現它。這裏被延伸的基類:
public abstract class Building {
abstract void destroy();
}
public BrickBuilding extends Building {
@Override
public void destroy() {
bricks.fallToGround();
}
}
public HayBuilding extends Building {
@Override
public void destroy() {
straw.blowInWind();
}
}
在你要使用switch語句建築類型切換在你的代碼的地方,只是抱到抽象Building
類型的引用,並調用方法destroy()
就可以了:
public class BuildingDestroyer {
public void rampage() {
for(Building building : allTheBuildings) {
// Could be a BrickBuilding, or a HayBuilding
building.destroy();
}
}
}
或者,以解決有關有很多小的類型你的關心,你可以「注入」你想要一個destroy
行爲變成一個普通的建築類型,像這樣...... albeing,你會最終有一個很多不同的銷燬行爲類也是如此......所以這可能不是一個解決方案。
public interface DestroyBehaviour {
void destroy(Building building);
}
public class Building {
private int id;
public DestroyBehaviour destroyBehaviour;
public Building(int id, DestroyBehaviour destroyBehaviour) {
this.id = id;
this.destroyBehaviour = destroyBehaviour;
}
public void destroy() {
destroyBehaviour.destroy(this); // or something along those lines;
}
}
您可以通過具有BuildingFactory類暴露了registerBuildingType(typeName的,instanceCreatorFunc)方法擺脫了巨型開關,即每棟樓調用類(例如從靜態初始化方法),以及被稱爲與該類的唯一字符串(類名稱即可)以及返回新實例的靜態「create」方法。
該方法還具有能夠從動態鏈接庫加載新建築物的優點。