Java设计模式—策略模式(商场打折)

        策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。

  再比如我们去逛商场,商场现在正在搞活动,有打折的、有满减的、有返利的等等,其实不管商场如何进行促销,说到底都是一些算法,这些算法本身只是一种策略,并且这些算法是随时都可能互相替换的,比如针对同一件商品,今天打八折、明天满100减30,这些策略间是可以互换的。

        策略模式是一种行为型设计模式,它允许在运行时选择算法的行为。在这个设计模式中,可以定义一系列的算法,将每种算法封装到单独的类中,并使它们可以相互替换。这样可以使算法的变化独立于使用算法的客户端。

        在这个打折策略的例子中,我们使用了策略模式来实现不同的打折算法,包括正常收费、打折收费和返利收费。下面是策略模式的主要组成部分及其作用:

  1. 策略接口(CashSuper):定义了一个算法族的公共接口,其中包含了所有具体算法类所需的方法。在这个例子中,CashSuper接口定义了acceptCash方法,用于计算最终的收费金额。

  2. 具体策略类:每个具体策略类实现了策略接口,提供了特定的算法实现。在这个例子中,CashNormal、CashDiscount和CashReturn分别是具体策略类,分别表示了正常收费、打折收费和返利收费的算法实现。

  3. 上下文类(CashContext):上下文类持有一个策略对象的引用,并在运行时根据客户端的需要选择合适的策略。在这个例子中,CashContext类根据传入的打折类型选择对应的打折策略,并在客户端请求时调用选定策略的方法。

        通过使用策略模式,我们可以方便地扩展和修改打折算法,而不必更改客户端的代码。例如,如果需要新增打折方式或修改现有的打折方式,只需创建新的具体策略类或修改现有的策略类,而不会影响到CashContext类或客户端的代码。这样的设计使得系统更加灵活和可维护。

        另外,策略模式还有利于代码的复用,因为每个具体策略类都是独立的,可以在不同的上下文中重复使用。同时,由于算法的实现被封装到了具体策略类中,客户端可以专注于业务逻辑,而无需关注具体的算法实现细节。

        总之,策略模式通过将算法封装成独立的策略类,并在运行时动态选择合适的策略,实现了算法的可插拔、可扩展和可维护的特性,是一种非常实用的设计模式。

package com.ss.qrcode.test;public class CashContext {private CashSuper cs;/***  定义打折类型枚举*/public enum TYPE {/*** 正常收费*/NORMAL,/***  打折收费*/CASH_DISCOUNT,/***  返利收费*/CASH_RETURN}public CashContext(TYPE t) {switch (t) {case NORMAL:cs = new CashNormal();break;// 假设打八折case CASH_DISCOUNT:cs = new CashDiscount(0.8);break;// 满300返100case CASH_RETURN:cs = new CashReturn(300, 100);break;default:System.out.println("匹配不符 !");}}/***   定义获取最终价格的方法*/public double getResult(double money) {return cs.acceptCash(money);}public static void main(String[] args) {// 输入原价,计算打折后的价格// 正常收费CashContext context1 = new CashContext(TYPE.NORMAL);double result1 = context1.getResult(1000);System.out.println("正常收费,结果:" + result1);// 打折收费CashContext context2 = new CashContext(CashContext.TYPE.CASH_DISCOUNT);double result2 = context2.getResult(1000);// 八折System.out.println("打折收费,结果:" + result2);// 返利收费CashContext context3 = new CashContext(TYPE.CASH_RETURN); // 满300返100double result3 = context3.getResult(1000);System.out.println("返利收费,结果:" + result3);}
}
public class CashDiscount implements CashSuper{// 折扣率private  double moneyDiscount;public CashDiscount(double moneyDiscount){this.moneyDiscount = moneyDiscount;}@Overridepublic double acceptCash(double money) {return money*moneyDiscount;}
}
public class CashNormal implements  CashSuper{@Overridepublic double acceptCash(double money) {return money;}
}
public class CashReturn implements CashSuper {private double moneyCondition; // 满足返利条件的金额private double moneyReturn; // 返利金额public CashReturn(double moneyCondition, double moneyReturn) {this.moneyCondition = moneyCondition;this.moneyReturn = moneyReturn;}@Overridepublic double acceptCash(double money) {double result = money;if (money >= moneyCondition) {// 计算返利金额result = money - Math.floor(money / moneyCondition) * moneyReturn;}return result;}
}

 

        策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。对于打折、返利或者其他的算法,其实都是对实际商品收费的一种计算方式,通过继承,可以得到它们的公共功能,公共的功能就是获得计算费用的结果GetResult,这使得算法间有了抽象的父类CashSuper。另外一个策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 每个算法可保证它没有错误,修改其中任一个时也不会影响其他的算法。这真的是非常好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python技能树学习-函数

题目一:递归调用 函数的参数: def dump(index, default0, *args, **kw): print(打印函数参数) print(---) print(index:, index) print(default:, default) for i, arg in enumerate(args): print(farg[{i}]:, arg) for…

Vue 样式技巧总结与整理[中级局]

SFC(单文件组件)由 3 个不同的实体组成:模板、脚本和样式。三者都很重要,但后者往往被忽视,即使它可能变得复杂,且经常导致挫折和 bug。 更好的理解可以改善代码审查并减少调试时间。 这里有 7 个奇技淫巧…

[StartingPoint][Tier2]Archetype

Task 1 Which TCP port is hosting a database server? (哪个端口开放了数据库服务) $ nmap 10.129.95.187 -sC --min-rate 1000 1433 Task 2 What is the name of the non-Administrative share available over SMB? (哪个非管理共享提供了SMB?) $ smbclient -N -L 1…

Rsync——远程同步命令

目录 一、关于Rsync 1.定义 2.Rsync同步方式 3.备份的方式 4.Rsync命令 5.配置源的两种表达方法 二、配置服务端与客户端的实验——下载 1.准备工作 2.服务端配置 3.客户端配置同步 4.免交互数据同步 5.源服务器删除数据是否会同步 6.可以定期执行数据同步 三、关…

JVM的简单介绍

目录 一、JVM的简单介绍 JVM的执行流程 二、JVM中的内存区域划分 1、堆(只有一份) 2、栈(可能有N份) 3、程序计数器(可能有N份) 4、元数据区(只有一份) 经典笔试题 三、JVM…

2024.3.28力扣每日一题——访问完所有房间的第一天

2024.3.28 题目来源我的题解方法一 模拟方法二 动态规划 题目来源 力扣每日一题;题序:1997 我的题解 方法一 模拟 使用一个Set存储已经访问过的房间号,直到Set中的元素个数等于房间数时停止模拟。 时间复杂度:O(day)。能够访问…

信息管理管理工程习题【1~4章】

1、将十进制68转换成二进制为( ),转换成八进制为( ),转换成十六进制为( )。 A. 1000100 102 40 B. 1000100 104 44 C. 1000101 102 40 D. 1000110 104 44 【答案】:B 2、…

如何恢复被.locked勒索病毒加密的服务器和数据库?

.locked勒索病毒有什么特点? .locked勒索病毒的特点主要包括以下几个方面: 文件加密:.locked勒索病毒会对受感染设备上的所有文件进行加密,包括图片、文档、视频和其他各种类型的重要文件。一旦文件被加密,文件的扩展…

淘宝商品描述API接口:轻松获取商品信息的新途径

淘宝商品描述API接口是淘宝开放平台提供的一种高效、便捷的新途径,旨在帮助开发者轻松获取淘宝商品的详细描述信息。通过这一接口,商家、开发者和用户都能获得商品标题、描述、属性、价格、图片等关键信息,从而满足各种业务需求。 在使用淘宝…

【Trick】AIGC翻译润色

1:可尝试在chat bar中提前输入以下内容: I want you to act as an English translator, spelling corrector and improver. I will speak to you in any language and you will detect the language, translate it and answer in the corrected and imp…

指针的深入理解(六)

指针的深入理解(六) 个人主页:大白的编程日记 感谢遇见,我们一起学习进步! 文章目录 指针的深入理解(六)前言一. sizeof和strlen1.1sizeof1.2strlen1.3sizeof和strlen对比 二.数组名和指针加减…

前端html+css+js常用总结快速入门

🔥博客主页: A_SHOWY🎥系列专栏:力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 学习前端全套所有技术性价比低下且容易忘记,先入门学会所有基础的语法(cssjsheml)&#xff…

深度挖掘商品信息,jd.item_get API助您呈现商品全面规格参数

深度挖掘商品信息,特别是在电商平台上,对于商家、开发者和用户来说都至关重要。jd.item_get API作为京东开放平台提供的一个强大工具,能够帮助用户轻松获取商品的全面规格参数,进而为商品分析、推荐、比较等提供有力的数据支撑。 …

using和typename在C++中的用法

using关键字有两个主要用途: 1.类型别名:使用using可以为类型创建新的名称,这在模板编程中尤其有用。 using integer int; integer a 5; // 这里的integer就是int类型2.命名空间:using可以用来引入命名空间中的名字&#xff0c…

Liquid的Covenants:处理比特币脚本中的金额

1. 引言 Covenants契约是一种允许introspection自省的结构: 交易output可以对花费其的交易施加条件(超出特定的“必须提供自身的有效签名和特定的公钥”)。 Rusty Russell 之前研究过Covenants: Examining ScriptPubkeys in Bitcoin Scrip…

两相欠压继电器 WY-35A3 额定输入电压100V 导轨安装 JOSEF约瑟

系列型号: WY-35A4电压继电器;WY-35B4电压继电器; WY-35C4电压继电器;WY-35D4电压继电器; WY-35A4D电压继电器;WY-35A4T电压继电器; WY-35B4D电压继电器;WY-35B4T电压继电器&#xf…

人工智能时代过失犯理论的挑战与应对—以自动驾驶汽车交通肇事为例

内容提要以自动驾驶汽车为代表的人工智能产品致害所涉犯罪主体复杂多样、前置性规范缺失, 以及人工智能产品固有的自主与黑箱特性等问题给过失犯理论带来了变革的压力与挑战。传统过失犯理论、新过失犯理论以及客观归责理论都无法解决人工智能产品致害所涉过失犯罪认定问题。人…

【VMware】虚拟机及镜像Ubuntu安装

Vmware 一.VM是什么?有什么用?二.下载VMware Wworkstation Pro三.安装虚拟机四.安装镜像 一.VM是什么?有什么用? vmware是一款运行在windows系统上的虚拟机软件,可以虚拟出一台计算机硬件,方便安装各类操作…

K8s学习七(服务发现_2)

Ingress Service 主要用于集群内部的通信和负载均衡,而 Ingress 则是用于将服务暴露到集群外部,并提供灵活的 HTTP 路由规则。在实际应用中,它们通常结合使用,Service 提供内部通信和负载均衡,Ingress 提供外部访问和…

网络工程师笔记18(关于网络的一些基本知识)

网络的分类 介绍计算机网络的基本概念,这一章最主要的内容是计算机网络的体系结构-ISO 开放系统互连参考模型,其中的基本概念,例如协议实体、协议数据单元,服务数据单元、面向连接的服务和无连接的服务、服务原语、服务访问点、相…