2015-04-01 70 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”方法。

该方法还具有能够从动态链接库加载新建筑物的优点。