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

一、概述

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

二、适用性

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.hqwc.cn/news/53694.html

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

相关文章

《MySQL》第十三篇 SELECT * 和 SELECT 字段名的区别

在实际开发中&#xff0c;进行数据查询的SQL无非有两种写法&#xff0c;使用SELECT * from tableName或者SELECT 字段名(多个) from tableName&#xff0c;二者各有利弊 SELECT * 写法 优点&#xff1a; 写法简单&#xff0c;不需要手动输入具体的字段&#xff0c;一定程度上…

并查集练习—省份数量

上一篇中讲了并查集及其原理&#xff0c;在这篇文章中简单应用一下。如果对并查集不是很了解强烈建议先看上一篇。 题目&#xff1a; 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相…

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

pydoc是python自带的一个文档生成工具&#xff0c;使用pydoc可以很方便的查看类和方法结构 本文主要介绍&#xff1a;1.查看文档的方法、2.html文档说明、3.注释方法、 一、查看文档的方法 **方法1&#xff1a;**启动本地服务&#xff0c;在web上查看文档 命令【python3 -m…

云上 Index:看「简墨」如何为云原生打造全新索引

拓数派首款数据计算引擎 PieCloudDB Database 是一款全新的云原生虚拟数仓。为了提升用户使用体验&#xff0c;提高查询效率&#xff0c;在实现存算分离的同时&#xff0c;PieCloudDB 设计与打造了全新的存储引擎「简墨」等模块&#xff0c;并针对云场景和分析型场景设计了高效…

基于Yolov2深度学习网络的车辆检测算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1. 卷积神经网络&#xff08;CNN&#xff09; 4.2. YOLOv2 网络 4.3. 实现过程 4.4. 应用领域 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022A 3.部分核心…

图论-简明导读

计算机图论是计算机科学中的一个重要分支&#xff0c;它主要研究图的性质和结构&#xff0c;以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

新版chrome浏览器恢复下载的时候恢复底栏提示

近日&#xff0c;谷歌对其Chrome浏览器进行了更新&#xff0c;为所有桌面系统的Chrome浏览器增加了位于地址栏右侧的“下载”气泡&#xff0c;并同时取消了原有的底部下载栏。 谷歌表示&#xff0c;这次更新的目的是为了让用户更方便地与最近下载的文件进行交互。 然而&#x…

Kubernetes v1.20 二进制部署

架构 k8s集群master01&#xff1a;192.168.80.101 kube-apiserver kube-controller-manager kube-scheduler etcd k8s集群master02&#xff1a;192.168.80.102 k8s集群node01&#xff1a;192.168.80.103 kubelet kube-proxy docker k8s集群node02&#xff1a;192.168.80…

windows永久暂停更新

目录 1.winr,输入regedit打开注册表 2.打开注册表的这个路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键空白地方新建QWORD值命名为:FlightSettingsMaxPauseDays 3.双击FlightSettingsMaxPauseDays,修改里面的值为100000,右边基数设置…

Python求均值、方差、标准偏差SD、相对标准偏差RSD

均值 均值是统计学中最常用的统计量&#xff0c;用来表明资料中各观测值相对集中较多的中心位置。用于反映现象总体的一般水平&#xff0c;或分布的集中趋势。 import numpy as npa [2, 4, 6, 8]print(np.mean(a)) # 均值 print(np.average(a, weights[1, 2, 1, 1])) # 带…

小白也能懂!业务中台与数据中台究竟是什么?

大家好&#xff0c;今天我们要讨论的是业务中台与数据中台&#xff0c;或许你对这些名词还不太熟悉&#xff0c;但别担心&#xff0c;接下来我将为你详细解释这两个概念&#xff0c;并且用通俗易懂的语言来解释它们。 业务中台是什么&#xff1f; 首先&#xff0c;让我们来了解…

打开的idea项目maven不生效

方法一&#xff1a;CtrlshiftA&#xff08;或者help---->find action&#xff09;&#xff0c; 输入maven&#xff0c; 点击add maven projects&#xff0c;选择本项目中的pom.xml配置文件&#xff0c;等待加载........ 方法二&#xff1a;view->tools windows->mave…