天天看點

設計一個網上書店,該系統中所有的計算機類圖書(ComputerBook)每本都有10%的折扣,所有的語言類圖書(LanguageBook)每本都有2元的折扣,小說類圖書(NovelBook)每100元

現使用政策模式來設計該系統,繪制類圖并程式設計實作

UML類圖

設計一個網上書店,該系統中所有的計算機類圖書(ComputerBook)每本都有10%的折扣,所有的語言類圖書(LanguageBook)每本都有2元的折扣,小說類圖書(NovelBook)每100元

書籍

package com.zheng;

public class Book {
  private double price;// 價格
  private Discount discount;// 維持一個對抽象折扣類的引用

  // 調用折扣類的折扣計算方法
  public double getPrice() {
    return discount.calculate(this.price);
  }

  public void setPrice(double price) {
    this.price = price;
  }

  public void setDiscout(Discount discount) {
    this.discount = discount;
  }

}      

調用不同價格的接口

package com.zheng;

public interface Discount {

  public double calculate(double price);//計算價格

}      

具體實作折扣

package com.zheng;

public class ComputerBook implements Discount {
  
  private final double DISCOUNT=0.9;//購買計算機類書籍90%的折扣

  @Override
  public double calculate(double price) {
    System.out.println("計算機類書籍");
    return price*DISCOUNT;
  }

}

package com.zheng;

public class LanguageBook implements Discount {
  private final double DISCOUNT=2;

  @Override
  public double calculate(double price) {
    System.out.println("語言類書籍");
    return price-DISCOUNT;
  }

}

package com.zheng;

public class NovelBook implements Discount {
  private final double DISCOUNT=10;

  @Override
  public double calculate(double price) {
    System.out.println("小說");
    if(price>=100) {
      return price-DISCOUNT;
    }
    else
      return price;
    
  }

}      

測試端

package com.zheng;


public class Client {

  public static void main(String[] args) {
    Discount discount,discount1,discount2;
    Book book=new Book();
    double originalPrice=100;//原價
  
    book.setPrice(originalPrice);
    System.out.println("原價為:"+originalPrice+"元");
    System.out.println("------------------------------");
    
    discount=new ComputerBook();
    book.setDiscout(discount);
    System.out.println("折扣後的價格:"+book.getPrice());
    System.out.println("------------------------------");
    discount1=new LanguageBook();
    book.setDiscout(discount1);
    System.out.println("折扣後的價格:"+book.getPrice());
    System.out.println("------------------------------");
    discount2=new NovelBook();
    book.setDiscout(discount2);
    System.out.println("折扣後的價格:"+book.getPrice());
  }

}      

測試截圖

設計一個網上書店,該系統中所有的計算機類圖書(ComputerBook)每本都有10%的折扣,所有的語言類圖書(LanguageBook)每本都有2元的折扣,小說類圖書(NovelBook)每100元

政策模式優缺點