设计模式之策略模式(Strategy)

news/2024/5/20 23:51:45/文章来源:https://blog.csdn.net/Lyon_yong/article/details/132123891

一、概述

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的类而变化。

二、适用性

1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

2.需要使用一个算法的不同变体。

3.使用算法的类不应该知道数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。

4.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。 将相关的条件分支移入它们各自的Strategy类中以代替这些条件语句。

三、参与者

1.Strategy 定义所有支持的算法的公共接口。Context使用这个接口来调用某个ConcreteStrategy定义的算法。

2.ConcreteStrategy实现Strategy接口实现某具体算法。

3.Context 用一个ConcreteStrategy对象来配置。 维护一个Strategy对象的引用。 可定义一个接口让Strategy访问它的数据。

四、类图

五、示例

Strategy

public interface Strategy {void method();
}

ConcreteStrategy

public class StrategyImplA implements Strategy{@Overridepublic void method() {System.out.println("这是第一个实现");}
}
public class StrategyImplB implements Strategy{@Overridepublic void method() {System.out.println("这是第二个实现");}
}
public class StrategyImplC implements Strategy{@Overridepublic void method() {System.out.println("这是第三个实现");}
}

Context

public class Context {private Strategy stra;public Context(Strategy stra) {this.stra = stra;}public void doMethod() {stra.method();}
}

自测

   @Testpublic void strategyTest() {Context ctx = new Context(new StrategyImplA());ctx.doMethod();ctx = new Context(new StrategyImplB());ctx.doMethod();ctx = new Context(new StrategyImplC());ctx.doMethod();}

自测结果 

Connected to the target VM, address: '127.0.0.1:7252', transport: 'socket'
这是第一个实现
这是第二个实现
这是第三个实现
Disconnected from the target VM, address: '127.0.0.1:7252', transport: 'socket'

六、实践

支付策略模式相关文件目录

 PayStrategy

/*** @author lyon* @createTime 2018年04月25日* @Description*/
public interface PayStrategy {/*** 支付*/void pay(BigDecimal money);/*** 申请退款*/void refund(BigDecimal money);/*** 查询退款*/void refundQuery();/*** 关闭订单*/void close();/*** 查询订单*/void query();
}

阿里支付相关-AliPayStrategy

/*** @author lyon* @createTime 2018年04月25日* @Description*/
@Service("AliPayStrategy")
public class AliPayStrategy implements PayStrategy {@Overridepublic void pay(BigDecimal money) {System.out.printf("支付宝支付了:%.2f元%n", money);}@Overridepublic void refund(BigDecimal money) {System.out.printf("支付宝申请退款:%.2f元", money);}@Overridepublic void refundQuery() {System.out.println("支付宝申请退款查询");}@Overridepublic void close() {System.out.println("支付宝关闭订单");}@Overridepublic void query() {System.out.println("支付宝查询订单");}
}

微信支付相关-WeChatPayStrategy

/*** @author lyon* @createTime 2018年04月25日* @Description*/
@Service("WeChatPayStrategy")
public class WeChatPayStrategy implements PayStrategy {@Overridepublic void pay(BigDecimal money) {System.out.printf("微信支付了:%.2f元%n", money);}@Overridepublic void refund(BigDecimal money) {System.out.printf("微信申请退款:%.2f元", money);}@Overridepublic void refundQuery() {System.out.println("微信申请退款查询");}@Overridepublic void close() {System.out.println("微信关闭订单");}@Overridepublic void query() {System.out.println("微信查询订单");}
}

建行龙支付

/*** @author lyon* @createTime 2018年04月25日* @Description*/
@Service("LongPayStrategy")
public class LongPayStrategy implements PayChannelStrategy {@Overridepublic void pay(BigDecimal money) {System.out.printf("建行龙支付支付了:%.2f元%n", money);}@Overridepublic void refund(BigDecimal money) {System.out.printf("建行龙支付申请退款:%.2f元", money);}@Overridepublic void refundQuery() {System.out.println("建行龙支付申请退款查询");}@Overridepublic void close() {System.out.println("建行龙支付关闭订单");}@Overridepublic void query() {System.out.println("建行龙支付查询订单");}
}

支付工厂

/*** @author lyon* @createTime 2018年04月26日* @Description*/
@Component
public class PayStrategyFactory {private PayStrategyFactory(){}private static Map<String, PayChannelStrategy> map = new ConcurrentHashMap<>();static {map.put("wechat", new WeChatPayStrategy());map.put("ali", new AliPayStrategy());map.put("long", new LongPayStrategy());}public static PayChannelStrategy getPayStrategy(String payType){return map.get(payType);}
}

自测

/*** @author lyon* @createTime 2018年04月25日* @Description*/
public class TestStrategy {@Resourceprivate PayStrategyFactory payStrategyFactory;@Testpublic void strategyTest() throws Exception {PayChannelStrategy payStrategy = payStrategyFactory.getPayStrategy("ali");if(null == payStrategy){throw new Exception( "支付类型为空") ;}BigDecimal money = new BigDecimal("12.01");payStrategy.pay(money);}
}

测试结果

Connected to the target VM, address: '127.0.0.1:11660', transport: 'socket'
支付宝支付了:12.01元
Disconnected from the target VM, address: '127.0.0.1:11660', transport: 'socket'

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

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

相关文章

mysql8查看执行sql记录历史,配置开启sql历史日志general_log

1.概要说明 mysql8默认未开启sql记录历史日志。 2.配置开启general_log 2.1.查看配置 general_log&#xff1a;是否开启sql日志。默认为OFFlog_output:日志输出位置&#xff1a; FILE&#xff1a;输出到文件。默认值TABLE&#xff1a;输出到表。mysql.general_log show v…

【Leetcode】(自食用)LRU算法(哈希链表法)

step by step. 题目&#xff1a; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键…

并查集练习 —岛屿数量(解法一)

题目&#xff1a; 给定一个二维数组matrix&#xff08;char[][]&#xff09;&#xff0c;里面的值不是1就是0&#xff0c;上、下、左、右相邻的1认为是一片岛。返回matrix中岛的数量。 本题共有2种解法&#xff0c;本篇先介绍最快的一种解法—递归。 分析&#xff1a; 递归的方…

Nginx启动报错- Failed to start The nginx HTTP and reverse proxy server

根据日志&#xff0c;仍然出现 “bind() to 0.0.0.0:8888 failed (13: Permission denied)” 错误。这意味着 Nginx 仍然无法绑定到 8888 端口&#xff0c;即使使用 root 权限。 请执行以下操作来进一步排查问题&#xff1a; 确保没有其他进程占用 8888 端口&#xff1a;使用以…

Linux进程(二)

文章目录 进程&#xff08;二&#xff09;Linux的进程状态R &#xff08;running&#xff09;运行态S &#xff08;sleeping&#xff09;阻塞状态D &#xff08;disk sleep&#xff09;深度睡眠T&#xff08;stopped&#xff09;状态X&#xff08;dead&#xff09;状态Z&#x…

小模型赋能大电网,手机拍照来建档

电能计量箱&#xff0c;一个听上去陌生&#xff0c;看到却一定觉得熟悉的东西。 作为电力系统中的关键组成部分&#xff0c;电能计量箱被广泛安装在各类生产生活区域&#xff0c;保护其内部的电能表、互感器等计量装置的安全&#xff0c;是保障电力系统稳定运行的重要设施。 随…

巨人网络宣布与华为达成鸿蒙生态合作,2024年发布原始征途手游

巨人网络宣布与华为达成鸿蒙生态合作&#xff0c;官方公众号发布的消息确认。 巨人网络与华为宣布战略合作&#xff0c;旨在实现技术互补、成果共享和商业共赢。 巨人网络将利用基于HarmonyOS的核心特性&#xff0c;如“可分可合、自由流转、一次开发多端部署”&#xff0c;创…

【Linux】内核线程创建 kthread_run 函数和内核中断

kthread_run函数详解 以PCIE的热插拔内核线程创建为例说明 注意&#xff1a;内核线程和RTOS的线程略有不同&#xff0c;这里Linux上创建以后直接运行&#xff0c;RTOS上有的是需要加入到调度队列中后才会执行&#xff0c;比如RT-Thread的系统 kthread_run 是 Linux 内核中的…

IO学习-线程

1&#xff0c;使用信号量的方式实现&#xff0c;将倒置以及打印的那道题目&#xff0c; 要求打印&#xff0c;倒置线程&#xff0c;顺序执行。出现的现象为先打印1234567&#xff0c;后打印7654321 不使用flag 运行结果&#xff1a; 2&#xff0c;创建两个线程&#xff0c;其中…

基于Mediapipe的姿势识别并同步到Unity人体模型中

如题&#xff0c;由于是商业项目&#xff0c;无法公开源码&#xff0c;这里主要说一下实现此功能的思路。 人体关节点识别 基于Mediapipe Unity插件进行开发&#xff0c;性能比较低的CPU主机&#xff0c;无法流畅地运行Mediapipe&#xff0c;这个要注意一下。 Mediapipe33个人体…

Java面向对象学习第三部分

一、Static修饰符 static是静态的意思&#xff0c;基本概念如下&#xff1a; Static分类&#xff1a; 一般我们分类都是按照是否使用static修饰进行分类。分为静态变量&#xff08;类变量&#xff09;、实例变量。 静态变量和实例变量的比较&#xff1a; 比较&#xff0c;…

探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面

文章目录 1 前言2 显示HTML的内容3 显示Markdown内容4 显示代码块5 显示DataFrame的交互式表格6 显示音频和视频7 显示图表8 显示图片9 显示地图10 显示PDF文件11 显示文件下载链接12 结语 1 前言 在这篇博文中&#xff0c;我们将着重介绍Streamlit中一个核心而重要的函数&…

数学知识(二)

一、裴蜀定理 对于任意整数a,b&#xff0c;一定存在非零整数x,y&#xff0c;使得 ax by gcd(a,b) #include<iostream> #include<algorithm>using namespace std;int exgcd(int a,int b,int &x,int &y) {if(!b){x 1,y 0;return a;}int d exgcd(b,a %…

《Java面向对象程序设计》学习笔记——第 1 章 Java入门

专栏&#xff1a;《Java面向对象程序设计》学习笔记

GoogleLeNet Inception V2 V3

文章目录 卷积核分解第一步分解&#xff0c;对称分解第二步分解&#xff0c;非对称分解在Inception中的改造一般模型的参数节省量可能导致的问题 针对两个辅助分类起的改造特征图尺寸缩减Model Regularization via Label Smoothing——LSR问题描述&#xff0c;也就是LSR解决什么…

风险管理概述

笔者认为&#xff0c;只掌握一堆算法&#xff0c;写一堆模型是远远不够的&#xff0c;模型和算法是基础和工具&#xff0c;能帮助我们更好的识别的管理风险。所谓风险管理&#xff0c;是定量与定性的结合&#xff1b;是量化与实务管理的结合。因此&#xff0c;构建一个对风险的…

Python 开发工具 Pycharm —— 使用技巧Lv.3

单步执行调试 1&#xff1a; 鼠标左键单击红点是断点行 2&#xff1a;甲虫样式是进行调试方式运行&#xff0c;鼠标左键单击点击 3&#xff1a; 单步运行图标&#xff0c;点击让程序运行一行 4&#xff1a; 步入步出&#xff0c;可以进入当前代码行函数内 5&#xff1a;重新运行…

【Python】模块学习之locust性能测试

目录 背景 安装 测试代码 运行命令 资料获取方法 背景 locust是一个python的第三方库&#xff0c;用于做性能测试&#xff0c;可使用多台机器同时对一台服务器进行压测&#xff0c;使用其中一台机器作为主节点&#xff0c;进行分布式管理 博主测试接口的时候一直是使用p…

展示Streamlit文本魔力(六):从头顶到脚尖

文章目录 1 前言✨2 st.markdown - 引入丰富的Markdown文本3 st.title - 引入引人注目的大标题4 st.header - 引入简洁的小标题5 st.subheader - 添加次级标题6 st.caption - 添加解释性文字7 st.code - 显示代码块8 st.text - 显示文本9 st.latex - 显示LaTeX公式10 st.divide…

设计模式之模板方法

一、概述 定义一个操作中的算法的骨架&#xff0c;将一些步骤延迟到子类中。 TemplateMethod使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。 二、适用性 1.一次性实现一个算法的不变的部分&#xff0c;并将可变的行为留给子类来实现。 2.各子类中公共…