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

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

设计一个网上书店,该系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,所有的语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元的更多相关文章

  1. 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。

    设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件. 我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录 ...

  2. 设计一个简单的devops系统

    前言 公司设计的RDMS挺好用的,我也照猫画虎简单的设计一个DevOps系统,与大家分享,不足之处欢迎拍砖,以免误人子弟 前置条件 gitlab gitlab-runner k8s 1. gitlab ...

  3. 023_统计当前 Linux 系统中可以登录计算机的账户有多少个

    #!/bin/bash #方法 1: grep "bash$" /etc/passwd | wc -l #方法 2: #-F END都要大写! awk -F: '/bash$/{x ...

  4. [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店

    一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...

  5. Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

    一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...

  6. 本地磁盘文件夹共享到虚拟机上的linux系统中

    1. 将本地的一个文件夹设置为共享文件 2.点击 虚拟机菜单中的  虚拟机->设置->选项->共享文件夹->总是启用->添加(将上一步骤设置的共享文件夹添加到里面) 3. ...

  7. 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记

    此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...

  8. 如何设计一个高内聚低耦合的模块——MegEngine 中自定义 Op 系统的实践经验

    作者:褚超群 | 旷视科技 MegEngine 架构师 背景介绍 在算法研究的过程中,算法同学们可能经常会尝试定义各种新的神经网络层(neural network layer),比如 Layer No ...

  9. C++中如何设计一个类只能在堆或者栈上创建对象,面试题

    设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调 ...

随机推荐

  1. Docker部署kafka|Go操作实践

    前言 写作本文的背景是由于字节的暑期青训营中,某个项目要求编写一个简易的流处理引擎(flink),开发语言不限,推荐Java,本着好奇心的驱使,我打算使用Go语言进行部分尝试. 既然是流处理引擎,那么 ...

  2. ansible一键安装GreatSQL并构建MGR集群

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 利用ansible一键安装GreatSQL并完成MGR部署. 本次介绍如何利用ansible一键安装GreatSQL并完成 ...

  3. ansible 的安装及常见模块使用

    ansible 基础keys的ssh协议配置的 特性:幂等性:一个任务执行1遍和执行n遍效果一样. ansible是个管理软件不是服务,不需要长期运行  一.通过epel源安装ansible, 1.下 ...

  4. java中String使用+

    String str1 = "hello"; String str2 = "hel" + new String("lo"); String ...

  5. 【NOI P模拟赛】最短路(树形DP,树的直径)

    题面 给定一棵 n n n 个结点的无根树,每条边的边权均为 1 1 1 . 树上标记有 m m m 个互不相同的关键点,小 A \tt A A 会在这 m m m 个点中等概率随机地选择 k k k ...

  6. 使用.Net对图片进行裁剪、缩放、与加水印

    图片的裁剪.缩放.与加水印,是任何系统经常要用到的功能,它们现已集成到IUtility工具中,使用十分简便.(具体代码将在文末给出,支持.NET/.NET Framework/.NET Core) 现 ...

  7. KFS邮件自动告警-数据比对-数据修复配置方法

    一.告警机制 用户可以通过配置告警机制,在比对完成和节点报错时接收到邮件告警. 告警机制共包含3个方面: 1. 告警配置 2. 用户订阅 3. 告警历史 KFS邮箱分两个部分,一个是接收告警信息的邮箱 ...

  8. 【Android 逆向】ARM while 逆向

    #include <stdio.h> int dowhile(int n){ int i = 1; int s = 0; do{ s += i; }while(i++ < n); r ...

  9. 《网页设计基础——HTML常用标签》

    网页设计基础--HTML常用标签       一.网页框架: 格式: <html> <head> <title>网页标题</title> <sty ...

  10. 【Tool】Idea快捷键

    Windows Ctrl + F12: 查找当前类中的方法 Ctrl + N: 查找类 Ctrl + Alt + H: 查看方法调用关系 Ctrl + H: 查看类的继承关系 Alt + F7:查找类 ...