天天看点

设计一个网上书店,该系统中所有的计算机类图书(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元

策略模式优缺点