设计一个网上书店,该系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,所有的语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元
现使用策略模式来设计该系统,绘制类图并编程实现
UML类图
书籍
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());
}
}
测试截图
策略模式优缺点
优点:1、符合开闭原则。2、避免重复的代码。3、可以避免多重条件选择语句。4、提供了一种算法的复用机制,不同的环境类可以方便的复用这些策略类。
缺点:1、无法同时在客户端使用多个策略类。2、将造成系统产生很多具体的策略类。3、客户端必须知道所有的策略类,自行决定使用哪一个策略类。