假设我有一个游戏,那里有按类型分类的建筑物。每种类型都表示为一个单独的类,但有时我必须为相同类型的建筑物做一些不常见的逻辑。怎么能实现这种行为?
例如,我可以通过ID识别建筑物,因此我可以在建筑类型类中使用巨型开关或命令模式。但我觉得这种做法有些不对劲。
另一种方法是为任何不同的逻辑设置不同的类。但这提出了很多小班。
答案 0 :(得分:1)
这是多态性旨在解决的问题,也是程序编程和oop编程之间的重大差异之一。您可以通过扩展基类或实现接口来实现它。这是扩展基类:
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();
}
}
}
或者,为了解决您对有很多小类型的担忧,您可以“注入”#39;你希望将destroy
行为转换为一种常见的建筑类型,就像这样......但是,你最终会得到很多不同的破坏行为类......所以,这可能不是一个解决方案。
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 :(得分:1)
你可以通过一个BuildingFactory类去掉巨型开关,该类暴露一个registerBuildingType(typeName,instanceCreatorFunc)方法,每个构建类调用(例如,从一个静态初始化方法),并使用一个唯一的字符串调用该类(类名称就足够了)和一个返回新实例的静态“create”方法
这种方法还具有能够从动态链接库加载新建筑物的优势。