Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 结合枚举类和策略模式进行模块化设计_Java_Oop_Design Patterns - Fatal编程技术网

Java 结合枚举类和策略模式进行模块化设计

Java 结合枚举类和策略模式进行模块化设计,java,oop,design-patterns,Java,Oop,Design Patterns,我是一名生物学家,正在努力提高我对Java和OOP的知识。我正在练习写一个游戏来练习良好的软件设计和模块化(为什么要做一些有趣的事情?) 这一想法与风险类似,但与国际银行业务有关。每家银行处理不同的货币;每种货币使用不同的面额。这些银行都提供相同的功能(余额、取款、存款、兑换),因此如果有一个接口,它们会做得很好。也可以使用表示每种面额及其值的枚举来很好地描述货币 这是我非常简单的例子。我可以为游戏中的每个县创建新的Country()对象 1)我是否必须手动指定每个国家的货币?例如: Count

我是一名生物学家,正在努力提高我对Java和OOP的知识。我正在练习写一个游戏来练习良好的软件设计和模块化(为什么要做一些有趣的事情?)

这一想法与风险类似,但与国际银行业务有关。每家银行处理不同的货币;每种货币使用不同的面额。这些银行都提供相同的功能(余额、取款、存款、兑换),因此如果有一个接口,它们会做得很好。也可以使用表示每种面额及其值的枚举来很好地描述货币

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

1)我是否必须手动指定每个国家的货币?例如:

Country Canada = new Country(CANCurrency);
这似乎相当笨拙,必须有更好的方法来做到这一点

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

每个国家都是这样的:

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....
}

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

您的具体问题是什么?看起来你已经有了一个解决方案。是的,我在这里也看不到问题。你需要什么?谢谢,我已经编辑了我的问题。我目前无法(在Netbeans中)直接从创建Country()对象的任何对象访问枚举值。我可以动态地实例化一组国家,还是需要对每个国家进行硬编码?后一个选项看起来很麻烦,也不太实用。我认为在这种情况下,枚举是处理有限元素集时的一个好选择,它们是不可变的(没有getter/setter)。如何使枚举无状态,每个值不是一个状态吗?@leonardo如果值不变,它是不可变的,这是关键。对我来说,无状态意味着它的值可以被方法调用替换。您不限于策略的枚举。您可能有一些策略是动态配置和创建的,而其他策略是枚举。谢谢。您对如何使此实现动态化有何建议?@leonardo您还可以使用
类MyCurrency implement ICurrency{/*字段、构造函数方法*/}
根据需要创建实例。仅仅因为你有一些枚举,并不意味着它们都必须是枚举。