如何根据对象ID做逻辑

时间:2015-04-01 15:26:17

标签: oop design-patterns architecture

假设我有一个游戏,那里有按类型分类的建筑物。每种类型都表示为一个单独的类,但有时我必须为相同类型的建筑物做一些不常见的逻辑。怎么能实现这种行为?

例如,我可以通过ID识别建筑物,因此我可以在建筑类型类中使用巨型开关或命令模式。但我觉得这种做法有些不对劲。

另一种方法是为任何不同的逻辑设置不同的类。但这提出了很多小班。

2 个答案:

答案 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”方法
这种方法还具有能够从动态链接库加载新建筑物的优势。