使用Java设计一个图书打折系统
时间:2011-03-23 zhangjunhd
书店推出打折消息:
[1]对于“新书”,没有折扣;
[2]对于“计算机”类图书,固定折扣为10元;
[3]对于“经管”类图书,折扣的书价的10%;
[4]购买5本以上的图书,固定折扣为20元;
[5]在所有的折扣计算后,总的折扣价不得超过50元。
1.使用Strategy模式
对于打折消息[1],[2],[3]针对三种类型的图书,可以使用Strategy模式。
NoDiscountStrategy代表购买“新书”的打折策略-没有折扣;
FlatRateStrategy代表购买“计算机”类图书的打折策略-固定折扣价;
PercentageStrategy代表购买“经管”类图书的打折策略-百分比折扣价。
<<abstract>>DiscountStrategy.java
package com.zj.books.strategy;
public abstract class DiscountStrategy {
protected double _price = 0.0;
public DiscountStrategy(double price) {
_price = price;
}
abstract public double calculateDiscount();
……
}
_price代表图书的价格;抽象方法calculateDiscount()表示具体的打折计算逻辑,延迟到子类中实现。下面的三个子类的部分逻辑。
NoDiscountStrategy.java
package com.zj.books.strategy;
public class NoDiscountStrategy extends DiscountStrategy {
public NoDiscountStrategy(double price) {
super(price);
}
public double calculateDiscount() {
return 0.0;
}
}
使用Java设计一个图书打折系统(2)
时间:2011-03-23 zhangjunhd
FlatRateStrategy.java
package com.zj.books.strategy;
public class FlatRateStrategy extends DiscountStrategy {
private double _discount = 0.0;
public FlatRateStrategy(double price, double discount) {
super(price);
_discount = discount;
}
public double calculateDiscount() {
return _discount;
}
……
}
PercentageStrategy.java
package com.zj.books.strategy;
public class PercentageStrategy extends DiscountStrategy {
private double _percent = 1.0;
public PercentageStrategy(double price, double percent) {
super(price);
if (percent > 1.0)
percent = 1.0;
_percent = percent;
}
public double calculateDiscount() {
return _price * _percent;
}
……
}
使用一个抽象基类Book持有一个策略引用,这个策略是抽象基类的引用。这个类中提供一个重要的方法getDiscount(),通过分配的具体策略的_strategy.calculateDiscount()方法来得到折扣。而如何实现Book具体子类与Strategy具体子类的配对,将使用工厂方法模式。
<<abstract>> Book.java
package com.zj.books;
import com.zj.books.strategy.DiscountStrategy;
public abstract class Book {
protected String _name;
protected int _typeCode;
protected double _price;
protected DiscountStrategy _strategy;
public Book(String name, int bookType, double price) {
_name = name;
_typeCode = bookType;
_price = price;
}
public double getDiscount() {
return _strategy.calculateDiscount();
}
……
}
使用Java设计一个图书打折系统(3)
时间:2011-03-23 zhangjunhd
2.使用 Factory Method模式
对 |