【发布时间】:2014-04-22 05:55:26
【问题描述】:
我想避免使用条件并应用一些技术来使代码在处理继承的类时更易于维护和扩展。
在这个例子中我们有。
MarketOrder 和 LimitOrder 都从基类 Order 扩展而来。
TradeServiceImpl 使用 getUnitPrice 方法计算 2 个订单将被交易的价格。
此方法有几个条件可以为不同类型的订单选择正确的价格。此外,它正在转换为派生类。
这种方法的问题是,如果我想添加 5 个新订单,我将有 7*7=49 个 if 语句,其中一些我需要转换为可能与另一个混淆的派生类,这看起来很容易编写错误的代码,并且给了我应该重新设计的气味。
请问我有什么想法吗?
// Domains.
public class Order{
private OrderTypeEnum orderType;
// can be buy or sell
public OrderTypeEnum getOrderType() {
return orderType;
}
public void setOrderType(OrderTypeEnum orderType) {
this.orderType = orderType;
}
}
public class LimitOrder extends Order{
private Long unitPrice;
public Long getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(Long unitPrice) {
this.unitPrice = unitPrice;
}
}
public class MarketOrder extends Order{
}
// Service.
public class TradeServiceImpl implements TradeService{
private TradeRepository tradeRepository;
public Long getUnitPrice(Order buyOrder, Order sellOrder){
if(buyOrder instanceof MarketOrder && sellOrder instanceof MarketOrder){
return tradeRepository.getLastPrice();
}
if(buyOrder instanceof MarketOrder && sellOrder instanceof LimitOrder){
return ((LimitOrder)sellOrder).getUnitPrice();
}
if(buyOrder instanceof LimitOrder && sellOrder instanceof MarketOrder){
return ((LimitOrder)buyOrder).getUnitPrice();
}
if(buyOrder instanceof LimitOrder && sellOrder instanceof LimitOrder){
return ((LimitOrder)buyOrder).getUnitPrice() + ((LimitOrder)sellOrder).getUnitPrice() /2;
}
return 0L;
}
}
【问题讨论】:
-
这里需要的基本概念是,不是根据
buyOrder和sellOrder的类来制作返回值,而是允许buyOrder和sellOrder来确定值自己。将您拥有的任何信息传递给其中一个或两个,并在Order的每个子类中编写代码以确定如何生成返回值。
标签: java oop design-patterns refactoring