使用Java设计一个图书打折系统

书店推出打折消息:

[1]对于“新书”,没有折扣;

[2]对于“计算机”类图书,固定折扣为10元;

[3]对于“经管”类图书,折扣的书价的10%;

[4]购买5本以上的图书,固定折扣为20元;

[5]在所有的折扣计算后,总的折扣价不得超过50元。

1.使用Strategy模式

对于打折消息[1],[2],[3]针对三种类型的图书,可以使用Strategy模式。

NoDiscountStrategy代表购买“新书”的打折策略-没有折扣;

FlatRateStrategy代表购买“计算机”类图书的打折策略-固定折扣价;

PercentageStrategy代表购买“经管”类图书的打折策略-百分比折扣价。

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

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具体子类的配对,将使用工厂方法模式。

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();   }……}

2.使用 FacTory Method模式

对于策略的分配,使用FacTory Method模式。这样对于书的种类和打折策略都是可以扩展的。

三个具体的Publish类分别针对三种类型的书和三种打折策略,给出具体的对象。

<> Publisher.java

package com.zj.purchase;import com.zj.books.Book;public interface Publisher {   Book bookFacTory(String name,double price);}

三个具体的子类实现bookFacTory方法,分别生成配对的具体Book类和具体Strategy类。

ComputerBookPublish.java

package com.zj.purchase;import com.zj.books.Book;import com.zj.books.ComputerBook;import com.zj.books.strategy.FlatRateStrategy;public class ComputerBookPublish implements Publisher{   private double _discount=0.0;   public ComputerBookPublish(double discount){    _discount=discount;   }   publi 有希望在的地方,痛苦也成欢乐

使用Java设计一个图书打折系统

相关文章:

你感兴趣的文章:

标签云: