2011-09-28 39 views
1

作为一项任务,我必须为一家商店制定一个股票系统。每种产品都有两个价格变量,一个用于普通客户,另一个用于重要客户。我无法决定一个简单的设计问题。到目前为止,我的课程如下所示:(设计)商店的库存经理:应该在哪里包含getPrice()方法?

class Customer { 
    ... 
    public Boolean isImportant() { return important; } 
} 

class Article { 
    ... 
    float importantCustomerPrice; 
    float normalCustomerPrice; 
} 

因此,现在我想为特定客户获得文章的价格。我应该:
1)将用getPrice()方法中的物品,例如:

class Article { 
    float getPrice(Customer customer) { 
     if (customer.isImportant() == true) { 
      return importantCustomerPrice; 
     } else return normalCustomerPrice; 
    } 
} 

2)使客户这样的两个子类为

class ImportantCustomer extends Customer { 
    float getPrice (Article article) { return article.getImportantCustomerPrice(); } 
} 
class NormalCustomer extends Customer { 
    float getPrice (Article article) { return article.getNormalCustomerPrice(); } 
} 

3)包含一个类管理它这两个类:

class Seller { 
float getPrice(Customer customer, Article article) { 
    if (customer.isImportant() == true) { 
     return article.getImportantCustomerPrice(); 
    } else return article.getNormalCustomerPrice(); 
} 

到目前为止,我认为,最安全和最灵活的选择是第二个,但它听起来我错了,客户端类的东西决定unre如文章的价格。此外,我的团队合作伙伴不喜欢为这样简单的事情添加更多班级的想法
您推荐哪一个?有更好的选择吗?

谢谢

+0

如果是作业,则应添加“家庭作业”标签。 – Uffe

回答

1

您可以实施策略模式。例如,创建一个PriceStrategy接口和一个名为ImportantCustomerPriceStrategy的实现,该实现检查customer.isImportant()。

以下代码过于简化,但这可能是一个很好的起点,可以让您实现许多不同的方式来确定给定购买的商品价格。我同意你的直觉,即将价格逻辑放入客户类是违反责任分配原则。

public interface Article { 
    void setPriceStrategy(PriceStrategy s) ; 
} 

public interface PriceStrategy { 
    float getPrice(Purchase, Article) ; 
} 

public interface Purchase { 
    Customer getCustomer() ; 
    List<Article> getArticles() ; 
} 

但是,您的第一个选项基本上是将策略编码到Article类中,这对于您的特定问题和要求可能完全可以接受。简化,简化,我总是说。

1

逻辑上,特定商品的要价是商品基本价格和提供给特定顾客的折扣的函数。反过来,这些都是逻辑属性文章和客户,分别为:

class Customer { 
    float getDiscountFactor(); 
}; 

class Article { 
    float getUnitPrice(); 
    // Or, allowing for volume discounts unrelated to customer discounts: 
    float getPrice(int nrUnits); 
}; 

类绑在一起不应该是卖家,而是要像

class Order { 
    Order(Customer customer); 
    void addItem(Article article, int nrUnits); 
    float getTotal(); 
}; 

这是假定你是自由的改变文章和客户的设计。如果不是,它应该仍然是Order,它计算Article和Customer的特定组合的实际价格;关于如何组合这些信息的知识不属于这两个类别中的任何一个。