Spring 设计模式之策略模式
Spring 设计模式之策略模式
- 策略模式
- 构成部分
- java举例
策略模式
策略模式:允许定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化可以独立于使用它们的客户端。
构成部分
- Context(上下文):维护一个对策略对象的引用,该对象用于客户端调用。
- Strategy(策略接口):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,以便环境角色可以使用这个接口来调用不同的算法。
- ConcreteStrategy(具体策略类):实现了策略接口,提供具体的算法实现。
java举例
// 策略接口
interface DiscountStrategy { double calculateDiscount(double totalAmount);
} // 具体策略1:百分比折扣
class PercentageDiscountStrategy implements DiscountStrategy { private double percentage; public PercentageDiscountStrategy(double percentage) { this.percentage = percentage; } @Override public double calculateDiscount(double totalAmount) { return totalAmount * percentage; }
} // 具体策略2:固定金额折扣
class FixedAmountDiscountStrategy implements DiscountStrategy { private double amount; public FixedAmountDiscountStrategy(double amount) { this.amount = amount; } @Override public double calculateDiscount(double totalAmount) { return amount; }
} // 上下文类
class Order { private DiscountStrategy discountStrategy; public Order(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double getTotalAmount() { // 假设订单总金额为1000元 return 1000.0; } public double calculateDiscount() { return discountStrategy.calculateDiscount(getTotalAmount()); }
} // 客户端使用
public class ECommercePlatform { public static void main(String[] args) { // 使用百分比折扣策略 Order order1 = new Order(new PercentageDiscountStrategy(0.10)); // 10%折扣 double discount1 = order1.calculateDiscount(); System.out.println("折扣金额: " + discount1); // 使用固定金额折扣策略 Order order2 = new Order(new FixedAmountDiscountStrategy(50.0)); // 固定减免50元 double discount2 = order2.calculateDiscount(); System.out.println("折扣金额: " + discount2); }
}
输出
折扣金额: 100.0
折扣金额: 50.0
我们定义了一个DiscountStrategy接口,并实现了两个具体策略类:PercentageDiscountStrategy(百分比折扣)和FixedAmountDiscountStrategy(固定金额折扣)。
然后,我们创建了一个Order类作为上下文类,它包含一个对DiscountStrategy对象的引用,并提供了计算折扣的方法。
在客户端代码中,我们根据不同的需求创建了不同的订单对象,并使用了不同的折扣策略来计算折扣金额。
相关文章:
Spring 设计模式之策略模式
Spring 设计模式之策略模式 策略模式构成部分java举例 策略模式 策略模式:允许定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化可以独立于使用它们的客户端。 构成部分 Context(上下文&…...
苹果开发 IOS 证书生成步骤
前提条件 你手上有一台 Macbook你的苹果账号已被添加到开发人员中 证书创建步骤 打开 XCode 直接生成 p12证书生成后,就可在苹果开发者管理界面中看到你的证书记录登录苹果开发中心,创建 profiles 文件,并下载以上步骤即可,就这…...
DDR2 SDRAM(五)初始化
因为DDR2本质上只是更高级的一种SRAM,底层操作原理和SRAM是一样的,所以很多基础的东西就不再赘述了。 一、原理 在初始化之前,DDR2芯片需要先上电,芯片有多个需要提供的电压,其大小和顺序也有要求,这部分…...
Python工具箱系列(五十七)
图像分割与人脸识别 众所周知图像是由若干有意义的像素组成的,图像分割作为计算机视觉的基础,对具有现有目标和较精确边界的图像进行分割,实现在图像像素级别上的分类任务。图像分割可分为语义分割和实例分割两类,区别如下&#x…...
数据智能驱动金融策略优化:民锋智能分析技术的应用
在现代金融市场中,数据分析与智能化技术的结合为投资策略带来了全新机遇。民锋以智能分析技术为核心,帮助投资者在复杂的市场环境中做出高效决策。本文将深入探讨民锋智能分析技术如何驱动策略优化,为投资者带来更加智能化的支持。 #### 一、…...
1009:带余除法
【题目描述】 给定被除数和除数,求整数商及余数。此题中请使用默认的整除和取余运算,无需对结果进行任何特殊处理。 【输入】 一行,包含两个整数,依次为被除数和除数(除数非零),中间用一个空格隔…...
Jmeter实际应用
环境准备 JDK1.8Jmeter 5.6.3 下载地址Jmeter 插件 下载地址 放到lib/ext下 常用命令 # 启动 sh jmeter# 集群模式下启动节点,不启动用不了集群 sh jmeter-server#生成ssl需要的证书, 这里会要求输入个密码,是要在jmeter中用的 keytool -import -ali…...
C++基础(11.AVL树的实现)
目录 AVL的概念: AVL树的实现: AVL树的结构: AVL树的插⼊: 平衡因⼦更新: 旋转: AVL树的其他功能: AVL树平衡检测: 测试代码*2: 源代码: KV结构: 源代码: AVL…...
c# 抽象方法 虚函数 使用场景
在C#中,抽象方法(abstract method)和虚函数(virtual method)都是用于实现多态性(polymorphism)的重要特性,但它们在使用上有一些关键的区别和各自的用途。 抽象方法(Abs…...
大数据安全方案 验证
一、背景 文档用于记录配置 Kerberos 和 Ranger 后,对 HDFS、Hive 认证和鉴权的功能测试。 二、Kerberos 验证 2.1、验证功能 1,HDFS 认证 2.1.1、访问 HDFS Kerberos 验证前,访问 HDFS 失败。 Kerberos 验证后,访问 HDFS 成…...
电脑软件:推荐一款免费且实用的电脑开关机小工具
目录 一、软件简介 二、软件功能 三、软件特点 四、使用说明 五、软件下载 今天给大家推荐一款免费且实用的电脑开关机小工具KShutdown,有需要的朋友可以下载试一下! 一、软件简介 KShutdown是一款精巧且实用的定时自动关机小工具,对于…...
php反序列化靶场随笔分析
项目地址:github.com/mcc0624/php_ser_Class 推荐使用docker部署:https://hub.docker.com/r/mcc0624/ser/tags 前面讲了以下php基础,我们直接从class6开始实验 class6 访问页面,传一个序列化的字符串,php代码将其反…...
动态规划 - 编辑距离
115. 不同的子序列 困难 给你两个字符串 s 和 t ,统计并返回在 s 的 子序列 中 t 出现的个数,结果需要对 10^9 7 取模。 算法思想:利用动态规划,分s[i - 1] 与 t[j - 1]相等,s[i - 1] 与 t[j - 1] 不相等两种情况具…...
力扣——113. 路径总和
113. 路径总和 II 给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], t…...
C02S04-Ubuntu基本使用
一、Ubuntu初始配置 1. 使用root用户 Ubuntu系统默认只能使用普通用户,要想使用root用户,需要先设置root用户密码。 进入终端,配置root用户密码。按照提示输入密码。 sudo passwd root配置完成后,执行下面的密码,切换…...
C语言 | Leetcode C语言题解之第525题连续数组
题目: 题解: struct HashTable {int key, val;UT_hash_handle hh; };int findMaxLength(int* nums, int numsSize) {int maxLength 0;struct HashTable* hashTable NULL;struct HashTable* tmp malloc(sizeof(struct HashTable));tmp->key 0, tm…...
Qml-Transition的使用
Qml-Transition的使用 Transition的概述 Transition:定义了当状态发生改变时应用的动画属性animations : list:(Transition)过渡的动画属性enabled : bool:状态发生变化时,是否使能此过渡(Transition)动画…...
Notepad++检索包含多个关键字的行
Notepad检索包含多个关键字的行 在Notepad中,你可以使用正则表达式来检索包含多个关键字的行。以下是具体步骤: 打开Notepad,打开要搜索的文件。 点击菜单栏上的“搜索”选项,然后选择“查找”。 在弹出的查找对话框中…...
C语言:水仙花树,要求三位以上的N位整数每位的N次方等于数本身,全部输出出来
#include <stdio.h> int main() { int n; scanf("%d",&n);//这里是说明多少n位整数 int first1; int i1; while(i<n){//此while循环可以得到n位数的最小位,例如3位的100. first*10; i; } ifirst; whil…...
金融贷款口子超市V2源码 Thinkphp开发的贷款和超市平台源码(亲测源码含安装视频教程)
金融贷款口子超市V2源码 Thinkphp开发的贷款和超市平台源码 源码下载:https://download.csdn.net/download/m0_66047725/89938268 更多资源下载:关注我。...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
