行为型设计模式之策略模式

news/2024/5/17 15:20:24/文章来源:https://blog.csdn.net/qq_38628046/article/details/126196514

行为型设计模式之策略模式

  • 策略模式
    • 应用场景
    • 优缺点
    • 主要角色
  • 策略模式的基本使用
    • 创建抽象策略角色
    • 创建具体策略角色
    • 创建上下文角色
    • 客户端执行
  • 策略模式实现支付方式的选择
    • 创建抽象策略角色
    • 创建具体策略角色
    • 创建上下文角色
    • 客户端执行

策略模式

策略模式(Strategy Pattern)也叫政策模式(Policy Pattern),属于行为型模式。

它是将定义的一系列算法、分别封装起来,让它们之间可以互相替换,从而让算法的变化不会影响到使用算法的用户。

策略模式能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。

应用场景

1、针对同一类型问题,有多种处理方式,每一种都能独立解决问题。2、算法需要自由切换的场景。3、需要屏蔽算法规则的场景。

优缺点

优点:

1.可以在运行时切换对象内的算法。2.避免使用多重条件转移语句,如if.else.语句、switch语句3.使用策略模式可以提高算法的保密性和安全性。4.可以将算法的实现和使用算法的代码隔离开来。

缺点:

1.客户端必须知道所有的策略,所有策略类都需要对外暴露,并且自行决定使用哪一个策略类。2.代码中会产生非常多策略类,增加维护难度。

主要角色

1.抽象策略角色(Strategy)

规定策略或算法的行为。

2.具体策略角色(ConcreteStrategy)

具体的策略或算法实现。

3.上下文角色(Context)

用来操作策略的上下文环境,屏蔽高层模块(客户瑞)对策略,算法的直接访问,封装可能存在的变化。

在这里插入图片描述

策略模式的基本使用

创建抽象策略角色

public interface IStrategy {/*** 算法、策略*/void algorithm();
}

创建具体策略角色

public class ConcreteStrategyA implements IStrategy {public void algorithm() {System.out.println("Strategy A 打9折");}
}
public class ConcreteStrategyB implements IStrategy {public void algorithm() {System.out.println("Strategy B 打8折");}
}

创建上下文角色

public class Context {private IStrategy mStrategy;public Context(IStrategy strategy) {this.mStrategy = strategy;}public void algorithm() {this.mStrategy.algorithm();}
}

客户端执行

    public static void main(String[] args) {// 创建具体策略IStrategy strategyA = new ConcreteStrategyA();IStrategy strategyB = new ConcreteStrategyB();// 创建上下文环境Context contextA = new Context(strategyA);Context contextB = new Context(strategyB);//客户端直接让上下文环境执行算法contextA.algorithm();contextB.algorithm();}
Strategy A9Strategy B8

策略模式实现支付方式的选择

创建抽象策略角色

创建支付抽象类,定义支付逻辑

public abstract class Payment {/*** 支付类型*/public abstract String getName();/*** 支付* @param uid 用户id* @param amount 金额* @return 支付结果*/public String pay(String uid, double amount){if(queryBalance(uid) < amount){return "支付失败,"+"商品金额:"+amount+" ,用户余额:"+queryBalance(uid);}return "支付成功,"+"商品金额:"+amount+" ,用户余额:"+(queryBalance(uid)-amount);}/*** 余额查询* @param uid 用户id* @return 余额*/protected abstract double queryBalance(String uid);
}

创建具体策略角色

创建具体支付方式,如AliPay 、WechatPay 、UnionPay等三种方式。

public class AliPay extends Payment {public String getName() {return "支付宝";}protected double queryBalance(String uid) {return 500;}
}public class WechatPay extends Payment {public String getName() {return "微信支付";}protected double queryBalance(String uid) {return 600;}
}public class UnionPay extends Payment {public String getName() {return "银联支付";}protected double queryBalance(String uid) {return 800;}
}

创建上下文角色

创建上下文角色,

public class PayStrategy {public static final String ALI_PAY = "AliPay";public static final String WECHAT_PAY = "WechatPay";public static final String UNION_PAY = "UnionPay";public static final String DEFAULT_PAY = ALI_PAY;private static Map<String, Payment> strategy = new HashMap<String, Payment>();static {strategy.put(ALI_PAY, new AliPay());strategy.put(WECHAT_PAY, new WechatPay());strategy.put(UNION_PAY, new UnionPay());}public static Payment get(String payKey) {if (!strategy.containsKey(payKey)) {return strategy.get(DEFAULT_PAY);}return strategy.get(payKey);}
}

客户端执行

public class Order {private String uid;private String name;private double price;public Order(String uid, String name, double price) {this.uid = uid;this.name = name;this.price = price;}public String pay() {return pay(PayStrategy.DEFAULT_PAY);}public String pay(String payKey) {Payment payment = PayStrategy.get(payKey);System.out.println("购买:"+name+" ,使用" + payment.getName() + "支付, " + "支付金额为: " + price);return payment.pay(uid, price);}
}
    public static void main(String[] args) {Order order = new Order("001","皮皮虾",500.5);System.out.println(order.pay());System.out.println("----------------------------------------------------");System.out.println(order.pay(PayStrategy.WECHAT_PAY));}
购买:皮皮虾 ,使用支付宝支付, 支付金额为: 500.5
支付失败,商品金额:500.5 ,用户余额:500.0
----------------------------------------------------
购买:皮皮虾 ,使用微信支付支付, 支付金额为: 500.5
支付成功,商品金额:500.5 ,用户余额:99.5

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

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

相关文章

线程安全集合:CopyOnWriteArrayList源码分析

目录 一、基本思想 二、源码分析 add()方法 set()方法 remove()方法 get()方法 三、小结 一、基本思想 首先CopyOnWrite 简称 COW &#xff0c;是一种用于对集合并发访问的优化策略。基本思想是&#xff1a;当我们往一个集合容器中写入元素时&#xff08;比如添加…

C++左值右值、左值引用右值引用、移动语义move

目录 1.什么是左值、右值 2.什么是左值引用&、右值引用&& 2.1左值引用& 2.2右值引用&& 2.3对左右值引用本质的讨论 2.3.1右值引用有办法指向左值吗&#xff1f; 2.3.2左值引用、右值引用本身是左值还是右值&#xff1f; 2.4 右值引用使用场景…

51单片机学习:静态数码管实验

实验名称&#xff1a;静态数码管实验 接线说明&#xff1a; 实验现象&#xff1a;下载程序后“数码管模块”最左边数码管显示数字0 注意事项&#xff1a; ***************************…

神经体液调节网络,神经网络能干嘛

神经网络的发展趋势如何&#xff1f; 神经网络的云集成模式还不是很成熟&#xff0c;应该有发展潜力&#xff0c;但神经网络有自己的硬伤&#xff0c;不知道能够达到怎样的效果&#xff0c;所以决策支持系统中并不是很热门&#xff0c;但是神经网络无视过程的优点也是无可替代…

CSDN编程竞赛-第六期(上)

CSDN编程竞赛报名地址&#xff1a;https://edu.csdn.net/contest/detail/16 努力是为了让自己不平庸&#xff1a; 前言/背景 四道题都是相关数组的&#xff0c;思路很好想&#xff0c;但是需要熟练使用&#xff0c;不能有小错误。 参赛流程 活动时间&#xff1a;9月8日-21日&a…

Python机器视觉--OpenCV进阶(核心)--图像直方图与掩膜直方图与直方图均衡化

1.图像直方图 1.1 图像直方图的基本概念 在统计学中&#xff0c;直方图是一种对数据分布情况的图形表示&#xff0c;是一种二维统计图表. 图像直方图是用一表示数字图像中亮度分布的直方图&#xff0c;标绘了图像中每个亮度值的像素数。可以借助观察该直方图了解需要如何调整…

记录一次关于Rank()排序函数问题

先来看应用场景吧 就是页面上有个top按钮 根据不同的top 进行筛选 比如我选择top5 那么在下方当前大区的销售额降序筛选出来最高的前五个销售员or客户这种场景 &#x1f496; 问题 问题1&#xff1a;为什么我的这个rank排序函数 这个华南大区 不是从1开始的呢 其他大区都是正…

java毕业设计选题系统ssm实现的商城系统(电商购物项目)

&#x1f345;文末获取联系&#x1f345; 一、项目介绍 《ssm实现的商城系统》该项目采用技术&#xff1a;springspringMVCmybaitsEasyUIjQueryAjax等相关技术&#xff0c;项目含有源码、文档、配套开发软件、软件安装教程、项目发布教程等 1.1 课题背景、目的及意义 当今社…

java 同学聚会AA制共享账单系统springboot 小程序022

本系统在一般同学会小程序的基础上增加了首页推送最新信息的功能方便用户快速浏览&#xff0c;是一个高效的、动态的、交互友好的同学会小程序。 用户在首页上会看到各类模块的推送内容&#xff0c;可以以最直接的方式获取信息&#xff0c;注册登陆后&#xff0c;可以对应经费信…

Unity基础笔记(5)—— Unity渲染基础与动画系统

Unity渲染基础与动画系统 Unity渲染基础 一、摄像机 1. 摄像机概念和现实中的摄像机很接近,Unity 中 Camera 组件负责将游戏画面拍摄然后投放到画面上 Camera 拍摄到的画面决定了 Game 面板的画面 创建场景的时候,Unity 会默认创建一个摄像机,所以我们点击 Game 面板才有画面…

【算法刷题】链表篇-链表的回文结构

文章目录题目要求方法1&#xff1a;思路代码方法2代码题目要求 链接&#xff1a;链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 1 -> 2 -> 3 -> 2 -> 1 1 -> 2 -> 2 -> 1 上面两个是回文结构 方法1&#xff1a;思路 1.遍历链表&#xff0c;把结点对应的…

网络安全基础——对称加密算法和非对称加密算法(+CA数字证书)

目录 一、数据传输时的安全特性 二、对称加密算法&#xff1a; 三、非对称加密算法 四、对称加密和非对称加密 — 融合算法&#xff1a; 五、CA数字证书&#xff1a; 一、数据传输时的安全特性 ———————————————————————————————————…

分布式进化算法

1 多解优化问题 多解优化问题是指一类具有多个最优解的复杂优化问题。多峰优化问题和多目标优化问题都是两类典型的多解优化问题&#xff0c;它们之前的统一关系&#xff0c;即都具有多个最优解。多峰优化问题要求算法找到多个具有相同适应度值得最优解&#xff0c;多目标优化问…

SpringBoot的核心原理(扒笔记记录)

这一课的主要重点&#xff1a; 自动装配以及starterJDBC数据库连接池ORM、JPA、MyBatis、Hibernate这样相关的一些技术 从Spring到SpringBoot 我们在工作中都可能用过了SpringBoot&#xff0c;特别是最近几点&#xff0c;Java开发者大军里的一员&#xff0c;我们一般可能上手就…

卷积神经网络相比循环神经网络具有哪些特征

CNN卷积神经网络结构有哪些特点&#xff1f; 局部连接&#xff0c;权值共享&#xff0c;池化操作&#xff0c;多层次结构。 1、局部连接使网络可以提取数据的局部特征&#xff1b;2、权值共享大大降低了网络的训练难度&#xff0c;一个Filter只提取一个特征&#xff0c;在整个…

Docker容器互联

前言&#xff1a; 虽然每个docker容器之间都能通过ip来进行互联&#xff0c;但当容器重新启动&#xff0c;ip就会被重新分配给重新启动的容器&#xff0c;这时同个容器由于重启导致ip不一样了&#xff0c;这时就会导致开发和运维的困难程度大大增加&#xff0c;这时候就要考虑…

springboot+学生信息管理 毕业设计-附源码191219

学生信息管理的设计与实现 摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&…

Maven下的依赖管理

依赖管理一. 使用坐标引入jar包二. 快捷方式导入jar包的坐标三. 自动导入设置四. 依赖范围一. 使用坐标引入jar包 使用坐标引入jar包的步骤&#xff1a; 在项目的 pom.xml 中编写 标签在 标签中 使用 引入坐标定义坐标的 groupId&#xff0c;artifactId&#xff0c;version 点…

用于文化遗产的VQA(基于ArtPedia数据集)

艺术 文化遗产领域 VQA parper 阅读 Visual Question Answering for Cultural Heritage 文章目录艺术 文化遗产领域 VQA parper 阅读前言方法visual Question Answering with visual and contextual questionsQuestion Classifier ModuleContextual Question Answering Module…

vue3 | HighCharts实战自定义封装之径向条形图

1.前言 目前正在做vue3的数据可视化项目&#xff0c;vue3的组合式api写法十分方便&#xff0c;可以有各种玩法&#xff0c;有兴趣的同学可以看我个人主页的其他文章。难点是在网上找了一圈的有关径向条形图的示例都没有好的解决方案&#xff0c;决心亲自下手&#xff0c;在其中…