GoF设计模式(十三) - 策略模式

智慧水务管理系统从设计到落地的完整实践指南 智慧水务是水务行业数字化转型的核心方向,其本质是通过物联网、大数据与算法模型,将传统经验驱动的水务运营转变为数据驱动的智能决策体系。完整架构涉及感知层设备选型、数据传输与边缘计算、GIS管网建模、DMA分区计量漏损分析等关键技术。其中,DMA分区计量是降低管网漏损最有效的手段之一,借助独立计量分区和夜间最小流量分析,可精准定位暗漏区域;而NB-IoT智能水表作为感知层核心设备,以低功耗、广覆盖的特性为高频数据采集提供了可靠支撑。系统真正落地还需重视数据标准化治理、平台选型与分阶段推进,从单点试点走向全面覆盖 阅读详情

前言

策略模式属于行为型模式,是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。

组成

上下文类(PayContext): 维护一个对PayStrategy对象的引用。
抽象策略类(PayStrategy): 定义所有支持的算法的公共接口或抽象类
具体策略类(AliPayStrategy、JdPayStrategy、WechatPayStrategy): 封装了具体的算法或行为,继承于PayStrategy

 

场景以支付方式为例

1. 支付类型枚举

public enum PayEnum {
    JD,
    ALIPAY,
    WECHAT
}

2. 策略抽象类

public abstract class PayStrategy {

    public abstract PayEnum payType();

    public abstract void pay();

}

3. 具体策略实现类

@Component
public class AliPayStrategy extends PayStrategy{

    @Override
    public PayEnum payType() {
        return PayEnum.ALIPAY;
    }

    @Override
    public void pay() {
        System.out.println("使用支付宝支付");
    }
}

 

@Component
public class JdPayStrategy extends PayStrategy{

    @Override
    public PayEnum payType() {
        return PayEnum.JD;
    }

    @Override
    public void pay() {
        System.out.println("使用京东支付");
    }
}
@Component
public class WechatPayStrategy extends PayStrategy{

    @Override
    public PayEnum payType() {
        return PayEnum.WECHAT;
    }

    @Override
    public void pay() {
        System.out.println("使用微信支付");
    }
}

3. 策略上下文

public class PayContext{

    private PayStrategy payStrategy;

    public PayContext(PayStrategy payStrategy){
       this.payStrategy = payStrategy;
    }

    public void  pay(){
        payStrategy.pay();
    }
}

4. 单元测试

@SpringBootTest
class StrategyDemoApplicationTests {

  
    @Test
    void contextLoads() {
        PayContext payStrategy =new PayContext(new AliPayStrategy());
        payStrategy.pay();
    }

}

5. 运行结果

 

通过实例化不同的策略类会使用不同的支付方式 ,但个人不太推荐使用这种方式(需要在客户端调用通过类型if else 来实例化对应的策略类)

优化:比如我只需要传入一个参数即可,大话设计模式一书中添加了简单工厂模式把if else 或 switch的判定写在了 context上下文中,将业务判定进行了隔离,但还是不太完美,如果新增一个策略类后  还需更改context上下文的switch条件。

如有对简单工厂模式不太了解的可以阅读 https://blog.youkuaiyun.com/javanbme/article/details/114922029 。

如何更好的实现?  话不多说直接上示例 。

 

1. 新增支付策略工厂

@Component
public class PayStrategyFactory implements ApplicationContextAware {

    private Map<PayEnum,PayContext> payStrategyMap = new HashMap<>();


    public PayContext getPayStrategy(PayEnum payEnum){
        if (!payStrategyMap.containsKey(payEnum)) {
            throw new IllegalArgumentException("PayContext not exist");
        }
        return payStrategyMap.get(payEnum);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        Map<String, PayStrategy> beansOfType = applicationContext.getBeansOfType(PayStrategy.class);
        beansOfType.forEach((k, payStrategy) -> {
            payStrategyMap.put(payStrategy.payType(),new PayContext(payStrategy));
        });
    }


}

2. 修改单元测试方法

@SpringBootTest
class StrategyDemoApplicationTests {

    @Autowired
    private PayStrategyFactory payStrategyFactory;

	@Test
	void contextLoads() {
        PayContext payStrategy = payStrategyFactory.getPayStrategy(PayEnum.ALIPAY);
        payStrategy.pay();
    }

}

运行结果和上述一致,而该方式只需指定不同的枚举类型即可, 当添加新的策略类时,无需更改工厂类和上下文! 即核心是使用了Spring的ApplicationContextAware类

不太了解的可以阅读  https://blog.youkuaiyun.com/javanbme/article/details/116096885 

源码: https://download.youkuaiyun.com/download/javanbme/18274617

 

C++——设计模式 面向对象的优点和缺点 面向对象的三大特点 设计模式的六大原则 单例模式(线程安全) 工厂方法模式 适配器模式 代理模式 观察者模式 策略模式 备忘录模式 模板模式 状态模式 责任链模式 装饰模式 命令模式 阅读详情

相关推荐

使用枚举类型的示例

枚举类型还提供了一些额外的功能,比如可以使用"values()"方法获取所有的枚举常量值,以及可以使用"name()"方法获取枚举常量的名称等。在上面的代码中,我们定义了一个名为"OrderStatus"的枚举类型,并列出了四个常量值:“PENDING_PAYMENT”、“PAID”、“SHIPPED"和"COMPLETED”。属性的类型是"OrderStatus"枚举类型,表示订单的状态。例如,我们可以定义一个名为"Order"的类,其中包含一个"status"属性,用于表示订单的状态。

DevProZ的博客 312

枚举的底层原理

文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 什么是枚举 枚举是JDK1.5新增的一种数据类型,是一种特殊的类,常用于表示一组常量,比如一年四季,12个月份,星期一到星期天,服务返回的错误码,结算支付的方式等等。枚举是使用enum关键字来定义。 枚举的使用 在使用枚举之前我们先探讨一个问题,为什么要使用枚举。 现在有个业务场景是结算支付,有支付宝和微信支付两种方式,1表示支付宝,2表示微信支付,还需要根据编码(1或2).

s_156的博客 724

支付宝文档,支付宝接口文档,枚举值

支付宝文档,详细说明以及各种枚举参数的说明,可根据不同的枚举参数得到支付各个步骤的状态

枚举+工厂+策略模式---多方式支付

枚举+工厂+策略模式

WYH1233211234567的博客 3208

经典教程GOF设计模式(中文版)

GOF23种经典设计模式中文版 学习设计模式的必备书籍

【智能体评测】BrowserUse:一款超越 Anthropic Computer Use 的开源智能体

本文将全面介绍 BrowserUse 的核心功能、配置与使用方法,以及通过多场景测试评估其性能。

surfirst的博客 4099

常用的枚举定义方式

【代码】常用的枚举类型。

2301_76479331的博客 569

使用moveit控制机械臂

位置设置:`target_pose.position.x = 0.12`, `target_pose.position.y = 0.41`, 和 `target_pose.position.z = 0.44` 分别设置了机械臂末端执行器的X, Y, 和 Z坐标。设定目标位置:`group.set_pose_target(target_pose)` 这一命令将之前定义的目标位置和姿态设置为当前机械臂组的目标,为接下来的路径规划做准备。在机械臂控制的过程中,设定精确的目标位置和姿态是实现精确操作的关键步骤。

realman_Rop的博客 3687

JAVA设计模式之策略模式

策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。 策略模式的主要优点如下。 多重条件语句不易维护,而使用策略模式可以避免使用多重条件语句,如 if...else 语句、switch...case 语句。 策略模式提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,

DAIHUINKZX的博客 692

Windows 环境下 OpenClaw 的安装与千问大模型配置

为了不占用 C 盘空间,重装系统也不丢失配置,本文详细记录了如何将 OpenClaw 安装在非系统盘,比如D 盘,并对接阿里云 通义千问大模型的全过程。主要是利用 NVM 和 npm 进行安装,方便后续一键升级,配置具有免费额度的Qwen API,这个只需要在阿里云百炼注册一个账号就能获得免费额度。

博客 6537

react +ant desiagn pro实现按钮操作权限控制

在ant desiagn pro中提供了一个access用于对权限进行控制,需引入useAccess和Access

Sylvasylva的博客 2211

GOF二十三种设计模式之单例模式

在GOF二十三种设计模式中,又进一步分为创建型模式、结构型模式、行为型模式三种,每一种下又分为不同的模式,分类列举如下: 创建型模式:单例模式、工厂模式、抽象工厂模式、建造者模式、原型模式。 结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。 行为型模式...

chongshantui0076的博客 153

ImportError: DLL load failed: 找不到指定的程序的解决方案

本文主要介绍了ImportError: DLL load failed: 找不到指定的程序的解决方案,希望能对使用Python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 18万+

java23种设计模式个人整理_GoF设计模式合集

1 概述 这篇文章是对GoF23种设计模式+1种非GoF模式的合集,由笔者自己的笔记整理而来,每个模式都详细描述了步骤,角色等,以及使用Java实现的具体的例子,下面是目录:基础设计模式概述UML基础创建型模式单例模式简单工厂模式(非GoF模式)工厂方法模式抽象工厂模式原型模式建造者模式结构型模式适配器模式桥接模式组合模式装饰模式外观模式享元模式代理模式行为型模式职责链模式命令模式解释器模式迭代器...

weixin_39669133的博客 105

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

【虚幻引擎UE】UE5 四步骤实现AI漫游与对话行为(含工程源码)

灵境引路人 3227

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2023 FasterNet 高效快速的部分卷积块

本文记录的是基于FasterNet的YOLOv11轻量化改进方法研究。FasterNet的网络结构借鉴 CNN 的设计理念,通过提出的PConv减少推理时的计算和内存成本,同时减少通道数并增加部分比例,降低延迟,并通过后续的PWConv来弥补特征信息可能缺失的问题,提高了准确性。本文在替换骨干网络中配置了原论文中的和六种模型,以满足不同的需求。

Limiiiing的博客 2030

JAVA GOF23种 设计模式

JAVA GOF23种 设计模式创建型模式:结构型模式:行为型模式: 创建型模式: 单例模式 工厂模式 抽象工厂模式 建造者模式 原型模式 结构型模式: 适配器模式 桥接模式 装饰模式 组合模式 外观模式 享元模式 代理模式 行为型模式: 模版方法模式 命令模式 迭代器模式 观察者模式 中介者模式 备忘录模式 解释器模式 状态模式 策略模式 职责链模式 访问者模式 ...

clearwater 367

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

gof23 设计模式 各个模式代码demo

gof23 设计模式 各个模式代码demo

nbspzs的专栏 634

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【设计模式】—Gof23种设计模式

前言: 大话设计模式中一直提到GoF,猜想应该是某位创建设计模式的鼻祖大牛,百度之后发现GoF原意: 设计模式的经典名著——Design Patterns: Elements of Reusable Object-Oriented Software,中译本名为《设计模式——可复用面向对象软件的基础》的四位作者Erich Gamma、Richard Helm、Ralph Johnson,以及Jo

爬向金字塔顶的蜗牛 2397

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

二十三种设计模式

文章目录二十三种设计模式1. 创建型模式1.简单工厂模式(不属于GOF23种设计模式之中)2. 工厂方法模式3. 抽象工厂模式4. 单例模式5. 建造者模式6. 原型模式2. 结构型模式1.适配器模式2. 装饰者模式3. 代理模式4. 外观模式5. 桥接模式6. 组合模式7. 享元模式3.行为型模式1. 策略模式2.模板模式3. 观察者模式4. 迭代器模式5. 责任链模式6. 命令模式7. 状态模式8. 备忘录模式9. 访问者模式10. 中介者模式11. 解释器模式 二十三种设计模式 设计模式总共有三大类,

m0_68292446的博客 456

二十三种设计模式 之 初识设计模式

什么是设计模式? 设计模式(Design Pattern) 是解决软件开发某些特定问题而提出的一些解决方案也可以理解成解决问题的一些思路。它并不是语法规定而是一套帮助我们增强代码的可重用性、可扩充性、 可维护性、可读性、健壮性以及安全性的解决方案! 设计模式由GoF(Gang Of Four) ⇒ 四人帮于1995年联合发布出版了《设计模式:可复用面向对象软件的基础》一书,从此树立了软件设计的里程碑。因此23种设计模式也被称为GoF23,也叫GoF设计模式。 设计模式有哪些? 设计模式分为三大类,分别是创建

木字楠的博客 763

GOF23种设计模式

GoF(“四人帮”,指Gamma, Helm, Johnson &amp; Vlissides, Addison-Wesley四人)提出的23种设计模式可谓经典,由于其定义比较严谨趋于理论化,故刚开始不一定很快掌握,下面简要对23种设计模式予以简要介绍,并给出现实中相关的通俗易懂的事例: 1、Abstract Factory 抽象工厂模式 --- 提供一个创建一系列相互或相互依存对象的接口,而无...

NeverGiveUp的博客 977

设计模式复习(十三)-------策略模式

1. 策略模式的简介 定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。 ——《设计模式》GoF 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。 如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题? 2. 策略模式的结构 环境(Context)角色:持有一个Strategy类的引用。 抽象策略(Strat

qq_41342326的博客 363

一句话总结GOF的23种设计模式

一、创建型模式    Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。    Builder:将一个复杂对象的构件与它的表示分离,使得同样的构建过程可以创建不同的表述。    Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。    Pro

行到水穷处 坐看云起时 1255
上一篇: GoF设计模式(五) - 原型模式(浅复制与深复制)
下一篇: GoF设计模式(六) - 适配器模式
让程序飞
博客等级 码龄10年 8831粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让程序飞

您的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值