作者:溪~源

blog.csdn.net/xuan_lu/article/details/114417396

定义

首先介绍一下众多博客文章中提到的策略模式的概念,针对于文章结构构成,请允许小编在此处再细说一下。

策略模式:百度百科中引述为:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。

  1. 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。

  2. 策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

【此处的算法,大家可以理解为解决业务需求的方法。】

对于这些概念大家理解起来或许有些抽象,耐心往下读,相信大家肯定会有所收获。

组成

  • 环境(Context)角色: 持有一个Strategy的引用。

  • 抽象策略(Strategy)角色: 这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。

  • 具体策略(ConcreteStrategy)角色: 包装了相关的算法或行为。

理解

对于设计模式中的策略模式,大家众多的解释可能侧重与解决if…else,switch-cas这种条件语句的优化,小编简单谈一下我在项目中实际应用和理解吧;对于策略模式按照上面给予的定义理解,是将多个业务节点具备的共同算法再次顶层抽象为接口,处理不同业务需求时,则产生的行为不同,即具体行为由其实现类解决;注重词:相同算法,,顶层抽出。

再简单举例说明一下,比如工作的OA系统中,流程节点具体相同的功能:提交,回退,撤回等等(抽象策略类);但是每个流程节点所实现的功能不同(具体策略类);

实现

小编以我们日常生活中最常见的支付方式为例,解答策略模式的应用。

无论使用xiaomi,huawei,apple均存在相同的行为(算法),例如:支付方式不同,客户端享受的优惠力度不等。故我们将支付作为共同的接口抽象出来。

UML

抽象策略类

将支付作为共同算法,顶层抽象。

/*** @author wx* @date 2021/03/05 1:50 下午*/
public interface PayStrategy {void pay(double money);
}

具体策略类

MiPAY

/*** @author wx* @date 2021/03/05 1:51 下午*/
public class MiPayStrategy implements PayStrategy{@Overridepublic void pay(double money) {double payMoney = money * 0.87;double discountMoney = money - payMoney;System.out.println("使用Mi pay成功支付" + payMoney + "元,优惠" + discountMoney + "元");}
}

HuaWeiPAY

/*** @author wx* @date 2021/03/05 1:50 下午*/
public class HuaWeiPayStrategy implements PayStrategy{@Overridepublic void pay(double money) {double payMoney = money * 0.85;double discountMoney = money - payMoney;System.out.println("使用HuaWei pay成功支付" + payMoney + "元,优惠" + discountMoney + "元");}
}

ApplePAY

/*** @author wx* @date 2021/03/05 1:52 下午*/
public class ApplePayStrategy implements PayStrategy{@Overridepublic void pay(double money) {double payMoney = money * 0.82;double discountMoney = money - payMoney;System.out.println("使用Apple pay成功支付" + payMoney + "元,优惠" + discountMoney + "元");}
}

环境类

供客户端调用,并选择具体策略

/*** @author wx* @date 2021/03/05 1:53 下午*/
public class PayContext {//依赖策略接口属性private PayStrategy payStrategy;public void setPayStrategy(PayStrategy payStrategy) {this.payStrategy = payStrategy;}/*** 提供外部访问方法* @param money*/public void payMoney(double money) {payStrategy.pay(money);}
}

客户端

客户端则已知选择的支付方式,可以服务端依据不同支付策略选择折扣。

/*** @author wx* @date 2021/03/05 1:59 下午*/
public class PayClient {public static void main(String[] args) {//创建支付上下文PayContext payContext = new PayContext();//创建支付策略,客户端已知存在具体策略PayStrategy miPayStrategy = new MiPayStrategy();payContext.setPayStrategy(miPayStrategy);payContext.payMoney(100);System.out.println("-------改变支付策略--------");PayStrategy applePayStrategy = new ApplePayStrategy();payContext.setPayStrategy(applePayStrategy);payContext.payMoney(100);}
}

执行结果:

理解了策略模式的使用,下面简单谈谈该模式的优点和缺点:

优点:

  1. 毫不疑问复合设计模式中的开闭原则,新增支付方式则扩展策略类即可,无须改动其他策略类的实现;

  2. 消除if-else类似的判断语句,整合代码结构,符合代码整洁之道;

缺点:

  1. 从类的数量上而言,若策略选择很多,则造成策略类数量增加;

  2. 所有策略类都需要对外暴露。即客户端必须知道所有的策略类,并自行决定使用哪一个策略类,故不得不向客户暴露具体的实现。

类比其他模式

策略模式和状态模式:

一、执行方式:

  • 策略模式:客户端策略条件选择只执行一次;

  • 状态模式:随着实例参数(对象实例的状态)的改变不停地更改执行模式。

简言之,策略模式只是在对象初始化的时候更改执行模式,而状态模式是根据对象实例的周期时间而动态地改变对象实例的执行模式。

二、环境类

  • 策略模式:环境类自己选择一个具体策略类,具体策略类无须关心环境类 ;

  • 状态模式:环境类由于外在因素需要放进一个具体状态中,以便通过其方法实现状态的切换 ,因此环境类和状态类之间存在一种双向的关联关系。

简言之,使用策略模式时客户端需要知道所选的具体策略是哪一个;

而使用状态模式时, 客户端无须关心具体状态 ,环境类的状态会根据用户的操作自动转换。

推荐好文

>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
>>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

如何理解和运用策略模式相关推荐

  1. 一文理解设计模式之--策略模式(Strategy)

    首先定义一组算法,将每一个算法封装起来,从而使它们可以相互切换 使用场景 同样的流程,需要执行不同的策略算法,传入不同策略,执行传入对应的策略算法 代码示例 /*** Context持有Strateg ...

  2. 结合JDK源码看设计模式——策略模式

    前言: 现在电商已经成为我们生活中不可或缺的购物渠道,同时各大商家会针对不同的时间做出不同的折扣,这在我们看来就是一种营销手段,也是一种策略,今天我们就来讲讲JDK中的策略模式是怎么样的. 一.定义 ...

  3. 设计模式之简单工厂模式与策略模式

    目录 一.简单工厂模式 二.策略模式 三.简单工厂和策略模式的相同和不同点 四.SpringBoot中用简单工厂搭配策略模式 一.简单工厂模式 概述:定义一个工厂类,它可以根据参数的不同返回不同的实例 ...

  4. 工厂模式与策略模式之区别

    设计模式有很多种,其中功能相似的很多,但是为什么还要分这么多种名字,查阅资料,我觉得下面的解释最为合理:用途不一样,名字就有区别,一把斧头用来砍人就叫凶器,用来砍柴就叫伐木斧,用来劈门就叫消防斧,这些 ...

  5. Android:设计模式-策略模式-关于Logger日志工具的使用

    Logger日志工具的使用 1.Logger介绍 2.策略模式 3.1[策略模式(Strategy)和委托(Delegate)的比较](https://blog.csdn.net/ycyangcai/ ...

  6. 设计模式-策略模式(Go语言描述)

    好久没有更新博客了,最近也是在忙着充电,今天这篇博客开始,我们来了解一下设计模式. 设计模式 那什么是设计模式呢?首先来看看我从百科上copy下来的概念吧. 设计模式/软件设计模式(Design pa ...

  7. 深入理解JavaScript系列(33):设计模式之策略模式(转)

    介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...

  8. php 策略模式实现原理,php 策略模式原理与应用深入理解

    php 策略模式原理与应用深入理解,策略,可以用,接口,简单,算法 php 策略模式原理与应用深入理解 易采站长站,站长之家为您整理了php 策略模式原理与应用深入理解的相关内容. 本文实例讲述了ph ...

  9. 深入理解JavaScript系列(33):设计模式之策略模式

    介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...

最新文章

  1. c++ STL容器初探
  2. 2008秋-计算机软件基础- 实验一 参考源程序
  3. 推荐系统——开源代码
  4. java biginteger位数,Java之BigInteger(面试题12:打印1到最大的n位数)
  5. (NO.00001)iOS游戏SpeedBoy Lite成形记(十)
  6. 监管大屏系统_餐饮公示大屏广告位招商正式启动!
  7. 信息学奥赛一本通C++语言——1019: 浮点数向零舍入
  8. 2016/1/14 java随机数生成
  9. 正常的vite创建项目并且安装vue router,vant的代码示例
  10. 用VBA模拟7段数码管显示数字
  11. 呕心沥血博一文--MySQL主从异步复制
  12. CentOS7上实现Squid缓存服务器的两种模式
  13. tippy.js_Tippy.js的指令包装
  14. 清华社英语在线自动教程python版
  15. Mac电脑如何设置屏幕保护程序的颜色?
  16. 软键盘遮挡edittext_Android软键盘遮挡的四种解决方案
  17. 一键导出ChatGPT聊天记录:让备份更简单
  18. 怎么设置计算机显示列表格式,(怎样显示excel的文件后缀名)excle后缀格式怎么显示...
  19. 一篇文章带你搞透redis高性能IO模型
  20. 2010年9月2号安排~

热门文章

  1. 贵!iPhone 11系列维修费用出炉 最高的可以入手一部华为P30 Pro了…
  2. 特斯拉再因致命Autopilot车祸被起诉 遭索赔逾1.5万美元
  3. 滴滴与比亚迪合作的无人车亮相:搭载6颗摄像头
  4. 全球首款采用离心风扇/90Hz刷新率的电竞手机红魔3发布
  5. 谋求“同股不同权”,旷视赴港上市渐近
  6. 设计模式 - 访问者模式
  7. 2021高考池州成绩查询,2021池州高考信息网
  8. opencv 亮度非线性变化 一
  9. 解决ubuntu系统udev多网卡名称变化的问题
  10. java中 static变量和方法到底是存在内存什么区域?