现使用策略模式来设计该系统,绘制类图并编程实现

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、客户端必须知道所有的策略类,自行决定使用哪一个策略类。

最新文章

  1. Alpha版本十天冲刺——Day 1
  2. QQ号验证
  3. bzoj4229: 选择
  4. Mongodb FAQ fundamentals(基础篇)
  5. C#微信公众号开发 -- (一)开发之前的准备
  6. swift锁屏播放,音乐进度更新,专辑,歌手名显示
  7. sass基本语法
  8. Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务
  9. UINavigationController 返回手势与 leftBarButtonItem
  10. 【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法
  11. -1-2 java 面向对象基本概念 封装继承多态 变量 this super static 静态变量 匿名对象 值传递 初始化过程 代码块 final关键字 抽象类 接口 区别 多态 包 访问权限 内部类 匿名内部类 == 与 equal
  12. GitHub-版本管理
  13. 上海线下技术交流(AA制)
  14. code128 C语言实现
  15. xunit-ICollectionFixture
  16. Ubuntu18.04 安装tomcat9
  17. Luogu5155 USACO18DEC Balance Beam(概率期望+凸包)
  18. Linux修改IP网络配置
  19. MySQL.Linux.安装
  20. Django中的应用

热门文章

  1. 技术分享 | load data导致主键丢失的神秘问题
  2. 字符编码和python中的文件处理
  3. ahooks 中那些控制“时机”的hook都是怎么实现的?
  4. 大家都能看得懂的源码 - ahooks useSet 和 useMap
  5. Java Stream 函数式接口外部实例的引用
  6. Python自学教程8-数据类型有哪些注意事项
  7. ABAQUS和UG许可证冲突问题的解决方案
  8. dotnet 设计规范 · 抽象定义
  9. 轻量级消息队列 Django-Q 轻度体验
  10. 第九十七篇:CSS的选择器及优先级