将枚举类与策略模式结合起来进行模块化设计

时间:2013-07-14 20:27:40

标签: java oop design-patterns

我是一名生物学家,正在努力提高我对Java和OOP的日期知识。我正在编写游戏来练习良好的软件设计和模块化(为什么要让它变得有趣?)。

这个想法就像风险,但有国际银行业务。每家银行都处理不同的货币;每种货币使用不同的面额。银行都提供相同的功能(余额,取款,存款,交换),因此可以很好地使用界面。使用代表每种面额及其价值的枚举也可以很好地描述货币。

这是我非常简单的例子。我可以为游戏中的每个县创建新的Country()对象。

1)我是否被迫手动指定每个国家/地区的货币?例如:

Country Canada = new Country(CANCurrency);

这看起来相当笨重,必须有更好的方法来做到这一点。

2)从使用County()的类中,如何直接访问其(间接包含的)Enum值?

每个国家/地区都是这样的:

public class Country {

    private final String name;
    private ICurrency currency;

    public Country(String name, ICurrency currency) {
        this.name = name;
        this.currency = currency;
    }

    // How do I access the specific Enum constants here?

}

这是我的银行界面:

public interface IBank {
    // Standard banking methods.
    public void deposit(int amount);
    public void withdraw(int amount);
    public int balance();
    public int exchange (Currency demandType, int demand, Currency offerType, int offer);
}

除了面额外,每个国家/地区的货币都会有相似的代码。

public interface ICurrency {
    public Currency getCurrency();
    // Maybe some more helper methods here.
}

这是加拿大的货币:

public enum CANCurrency interface ICurrency {
    LOONIE(1), TWONIE(2), FIVE(5); // etc....
}

和美国的货币:

public enum USACurrency interface ICurrency {
    ONE(1), FIVE(5), TEN(10); // etc....
}

1 个答案:

答案 0 :(得分:1)

您可以使用枚举,甚至是单例枚举来实现策略。事实上,这是恕我直言的最佳方式。通常最好确保你的枚举是不可变的和无状态的,但它们不是必须的。