2015-04-01 66 views
0

假設我有一個遊戲,那裏有按類型排序的建築物。每種類型都表示爲一個單獨的類,但有時我必須爲同一類型的建築物執行一些不常見的邏輯。怎麼能實現這種行爲?如何基於對象ID做邏輯

例如,我可以通過ID識別建築物,因此我可以在建築類型類中使用巨型開關或命令模式。但我認爲這種方法有些不對。

另一種方法是對任何發散邏輯都有不同的類。但是這提出了許多小類。

回答

1

這是多態性旨在解決的問題,也是程序和編程之間的巨大差異之一。您可以通過擴展基類或實現接口來實現它。這裏被延伸的基類:

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; 
    } 
} 
1

您可以通過具有BuildingFactory類暴露了registerBuildingType(typeName的,instanceCreatorFunc)方法擺脫了巨型開關,即每棟樓調用類(例如從靜態初始化方法),以及被稱爲與該類的唯一字符串(類名稱即可)以及返回新實例的靜態「create」方法。

該方法還具有能夠從動態鏈接庫加載新建築物的優點。