对于我的交易程序,我有一个Merchant类。给定的Merchant对象可能具有特定的特殊属性,也可能不具有特定的特殊属性。例如,一个Merchant对象可能具有股票经纪人属性,另一个Merchant对象可能具有Financial Services和股票经纪人属性,而另一个Merchant对象可能根本没有特殊属性。
我最初的想法是创建一个HashMap和一个Qualities类,如下所示:
Map<Qualities, Boolean> merchantQualities = new HashMap<Qualities, Boolean>();
唯一的问题是,对于Merchants来说,至少有50种可能的特殊质量,因此将质量类中的所有质量细分为子类将是非常令人厌烦的。
有没有一种更好的方法来编码这些可选的特殊质量,并在Merchants类中表示它们,而不是使用HashMap并子类化一个质量类?
发布于 2010-04-17 11:40:40
这完全取决于Qualities
是什么以及它们做了什么。如果列表相当稳定,enum
s可能是一个很好的解决方案:
enum Quality {
MERCHANT,
STOCKBROKER,
...
}
enum
的好处是它们基本上是类,所以可以实现接口,并具有状态和行为。它们还附带了有用的助手类:
Set<Quality> = EnumSet.of(MERCHANT, STOCKBROKER);
然后你就可以使用所有的Set
函数了,比如contains()
等等。
但在不了解更多信息的情况下,我无法告诉您这是否是适合您的解决方案。
编辑:在许多语言中,一个常见的起点就是枚举。在C/C++/C#中,这类似于:
if (merchantType == STOCKBROKER) { ... }
下面是Java的枚举更好的地方。假设您为股票类型定义了另一个枚举:
enum StockType {
LISTED_EQUITIES,
MANAGED_FUNDS
}
如果你假设一个给定的商家类型销售一种类型的东西:
enum MerchantType {
STOCKBROKER(StockType.LISTED_EQUITIES),
FINANCIAL_ADVISER(StockType.MANAGED_FUNDS);
private final StockType stockType;
MerchantType(StockType stockType) {
this.stockType = stockType;
}
public StockType getStockType() {
return stockType;
}
}
因此,与其说:
StockType stockType;
if (merchantType == MerchantType.STOCKBROKER) {
stockType = StockType.EQUITIES;
}
...
你可以说:
StockType stockType = merchantType.getStockType();
Java枚举有状态和行为。这是一个非常强大的概念。
但你可以做得更好。与其假设每个商家一只股票,不如通过行为来处理:
enum MerchantType {
STOCKBROKER,
FINANCIAL_ADVISER;
private static final Map<MerchantType, Set<StockType>> STOCK_TYPES;
static {
STOCK_TYPES = new EnumSet<MerchantType, Set<StockType>>(MerchantType.class);
STOCK_TYPES.put(STOCKBROKER, EnumSet.of(StockType.LISTED_EQUITIES));
STOCK_TYPES.put(FINANCIAL_ADVISER,
EnumSet.of(StockType.LISTED_EQUITIES, StockType.MANAGED_FUNDS));
}
public boolean canSell(StockType stockType) {
Set<StockType> stockTypes = STOCK_TYPES.get(this);
return stockTypes != null && stockTypes.contains(stockType);
}
}
在这一点上,你的代码会变成:
if (merchantType.canSell(StockType.LISTED_EQUITIES)) {
...
}
这是一种更自然、更具可读性和可扩展性的解决方案。
发布于 2010-04-17 11:57:08
我认为你可以使用这里的装饰器模式来装饰你的商家与各种装饰器(股票经纪人,金融服务。等)看一看http://en.wikipedia.org/wiki/Decorator_pattern
https://stackoverflow.com/questions/2657123
复制相似问题