设计一个网上书店,该系统中所有的计算机类图书(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、客户端必须知道所有的策略类,自行决定使用哪一个策略类。
设计一个网上书店,该系统中所有的计算机类图书(ComputerBook)每本都有10%的折扣,所有的语言类图书(LanguageBook)每本都有2元的折扣,小说类图书(NovelBook)每100元的更多相关文章
- 设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件。
设计一个树型目录结构的文件系统,其根目录为 root,各分支可以是目录,也可以是文件,最后的叶子都是文件. 我实现的功能是提供父目录(兄弟目录),输入文件名,创建树型目录结构,文本文件不可以再有子目录 ...
- 设计一个简单的devops系统
前言 公司设计的RDMS挺好用的,我也照猫画虎简单的设计一个DevOps系统,与大家分享,不足之处欢迎拍砖,以免误人子弟 前置条件 gitlab gitlab-runner k8s 1. gitlab ...
- 023_统计当前 Linux 系统中可以登录计算机的账户有多少个
#!/bin/bash #方法 1: grep "bash$" /etc/passwd | wc -l #方法 2: #-F END都要大写! awk -F: '/bash$/{x ...
- [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店
一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...
- Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥
一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核 ...
- 本地磁盘文件夹共享到虚拟机上的linux系统中
1. 将本地的一个文件夹设置为共享文件 2.点击 虚拟机菜单中的 虚拟机->设置->选项->共享文件夹->总是启用->添加(将上一步骤设置的共享文件夹添加到里面) 3. ...
- 20135202闫佳歆--week3 构造一个简单的Linux系统MenuOs--学习笔记
此为个人学习笔记存档 week 3 构造一个简单的Linux系统MenuOs 复习: 计算机有三个法宝:存储程序计算机,函数调用堆栈,中断 操作系统有两把剑: 1.中断上下文的切换,保存现场和恢复现场 ...
- 如何设计一个高内聚低耦合的模块——MegEngine 中自定义 Op 系统的实践经验
作者:褚超群 | 旷视科技 MegEngine 架构师 背景介绍 在算法研究的过程中,算法同学们可能经常会尝试定义各种新的神经网络层(neural network layer),比如 Layer No ...
- C++中如何设计一个类只能在堆或者栈上创建对象,面试题
设计一个类,该类只能在堆上创建对象 将类的构造函数私有,拷贝构造声明成私有.防止别人调用拷贝在栈上生成对象. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建 注意 在堆和栈上创建对象都会调 ...
随机推荐
- Apache DolphinScheduler 的持续集成方向实践
今天给大家带来的分享是基于 Apache DolphinScheduler 的持续集成方向实践,分享的内容主要为以下六点: " 研发效能 DolphinScheduler CI/CD 应用案 ...
- Windows下安装新硬盘
首先,插上一个硬盘然后开机,会发现"我的电脑/此电脑"里面并没有这个硬盘,这是因为此时硬盘还没初始化和分区,分完区后每个分区会被作为一个逻辑盘显示在里面.那么接下来就是过程. Wi ...
- .NET 6应用程序适配国产银河麒麟V10系统随记
最近想在麒麟系统上运行.NET 6程序,经过一番折腾最终完成了,简单记录一下. 目标系统: CPU: aarch64架构(ARM64) 操作系统:银河麒麟V10高级服务器系统 银河麒麟V10系统(以下 ...
- 原生应用、Web 应用和混合应用的概念,以及 Flutter 技术是什么
应用类型 原生应用 原生应用就是使用特定的语言开发的应用,例如 Android 原生应用.Windows 原生应用.iOS 原生应用等.开发 Android 原生应用时,其特定的编程语言为 Java ...
- jsp获取下拉框组件的值
jsp获取下拉框组件的值 1.首先,写一个带有下拉框的前台页 1 <%@ page language="java" contentType="text/html; ...
- MongoDB,入门看这一篇足矣!
一.介绍 在介绍 MongoDB 之前,我先介绍一下业务开发的时候遇到的痛点,以便大家对它有一个更加清晰的认识! 最近在用数据库存储数据的时候发现这么一个坑,例如从消息队列中监听消息的时候,原来的做法 ...
- KingbaseES V8R6集群同步模式synchronous参数配置详解
如下图所示: 集群数据同步原理说明: synchronous参数配置测试: 集群节点信息: ID | Name | Role | Status | Upstream | repmgrd | PID | ...
- SpringBoot多重属性文件配置方案笔记
SpringBoot多重属性文件配置方案笔记 需要重写PropertyPlaceholderConfigurer 同时要忽略DataSourceAutoConfiguration @SpringBoo ...
- FileInputStream字节输入流
FileInputStream字节输入流 编码思想:首相顶一个FileInputStream字节输入流对象,fis设置为nul,在try/catch里面放入FileInputStream字节输入流对象 ...
- Maven 过滤问题
<build> <resources> <resource> <directory>src/main/resources</directory&g ...