带你认识设计模式的【策略模式】及优缺点

《C++设计模式》策略模式 介绍了C++模式的策略模式 阅读详情

简述

预先定义有着不同执行过程但结果相同的算法族,运行时指定所需算法。

算法族 此处为一组有共同主题的有相同结果的不同算法的集合。

话不多说,看个优化案例。

优化案例

最初版v0

不使用策略模式的案例。四种不同的计算策略。客户端的代码如下。

// 客户端
public class Client {
public static void main(String[] args) {
String target = "公园";
Scanner sc = new Scanner(System.in);
String input = sc.next();
if ("foot".equals(input)) {
System.out.println("徒步到目的地:" + target);
} else if ("bike".equals(input)) {
System.out.println("骑自行车到目的地:" + target);
} else if ("car".equals(input)) {
System.out.println("开车到目的地:" + target);
}
sc.close();
}
}

具体的条件分支都写在客户端,日后增加新的条件分支时也需要修改客户端。修改客户端这件事往往是不太愿意接受的。原因是我们希望客户端尽可能少的改变,以便减少客户使用系统的学习成本。

传统的方法就只能增加if条件判断了,如下。

修改版v1

只需修改客户端,其他代码不变。

// 客户端
public class Client {
public static void main(String[] args) {
String target = "公园";
Scanner sc = new Scanner(System.in);
String input = sc.next();
if ("foot".equals(input)) {
Foot foot = new Foot();
foot.toTarget(target);
} else if ("bike".equals(input)) {
Bike bike = new Bike();
bike.toTarget(target);
} else if ("car".equals(input)) {
Car car = new Car();
car.toTarget(target);
}
sc.close();
}
}

可以看出客户端依旧与各个具体的类耦合(从类的创建到方法的调用都是如此)。

可以使用策略模式优化,使得方法调用不需要if条件判断,传入什么样的对象就使用什么对象的行为。

修改版v2(策略模式)

public interface Trans {
void toTarget(String target);
}
// 徒步去目的地
public class Foot implements Trans {
@Override
public void toTarget(String target) {
System.out.println("徒步到目的地:" + target);
}
}
// 骑自行车去目的地
public class Bike implements Trans {
@Override
public void toTarget(String target) {
System.out.println("骑自行车到目的地:" + target);
}
}
// 开车去目的地
public class Car implements Trans {
@Override
public void toTarget(String target) {
System.out.println("开车到目的地:" + target);
}
}
// 上下文类,根据客户端业务的需求持有不同的计算对象
public class Context {
private Trans trans;
public Context(Trans trans) {
this.trans = trans;
}
// 更改持有的计算对象
public change(Trans trans) {
this.trans = trans;
}
// 实际调用持有的trans实现计算
public int toTarget(String target) {
return trans.toTarget(target);
}
}

修改后,客户端代码调用。

// 客户端
public class Client {
public static void main(String[] args) {
String target = "公园";
Scanner sc = new Scanner(System.in);
String input = sc.next();
Context context = null;
if ("foot".equals(input)) {
context = new Context(new Foot());
} else if ("bike".equals(input)) {
context = new Context(new Bike());
} else if ("car".equals(input)) {
context = new Context(new Car());
}
System.out.println(context.toTarget(target));
sc.close();
}
}

代码量确实有一定的减少,但是客户端代码从只与各个具体Trans类的实现类耦合到多耦合一个上下文类,这样想与我们的需求背道而驰啊。实际上,单纯的策略模式就是如此,只负责减少方法调用的if语句,而不设计对象创建的封装与优化。

说到对象创建的优化,就得说到工厂模式了,事实上在使用策略模式时,为了创建对象也变得方便,通常也会使用到工厂模式进行优化。详情看以下优化案例。

修改版v3(策略+简单工厂)

现有代码都不需要改变,只需要使用简单工厂封装上下文对象的创建即可。

// 工厂类,创建持有不同Trans对象的上下文对象
public class Factory {
public static Context create(String input) {
if ("foot".equals(input)) {
return new Context(new Foot());
} else if ("bike".equals(input)) {
return new Context(new Bike());
} else if ("car".equals(input)) {
return new Context(new Car());
}
return null;
}
}

修改后,客户端代码调用。

// 客户端
public class Client {
public static void main(String[] args) {
String target = "公园";
Scanner sc = new Scanner(System.in);
Context context = Factory.create(sc.next());
System.out.println(context.toTarget(target));
sc.close();
}
}

客户端代码大幅减少,并且客户端中仅仅与Context类存在耦合。创建与使用的核心逻辑都从客户端剥离,且具体调用的方法也只有在运行时才知晓(核心目的)。这样就能少些很多if语句了。

总结

优点

  • 可以大幅减少if语句的书写。

  • 增加新的实现方法也不需要修改客户端代码,只需要增加实现类。

缺点

  • 单纯的策略模式需要客户端对于各个实现类有足够的了解,提升了开发时对系统的理解难度。

  • 策略过多时,存在策略膨胀的问题。鉴于策略膨胀问题,应该慎用策略模式。这是使用混合模式或许可以解决这个问题。

  • 混合模式 即在策略模式的实现类的方法中使用if语句分割各个情况。

适用场景

  • 想要优化系统中过多的if语句时。

【设计模式】——策略模式 策略模式是一种强大而灵活的设计模式,它可以帮助我们处理不同的算法或行为,并使系统更具可维护性和扩展性。通过封装具体的策略类和使用上下文对象,我们可以轻松地选择和切换不同的策略,而无需修改现有的代码。 阅读详情

相关推荐

剖析 Java 领域策略模式的优缺点及适用场景

在Java开发中,我们常遇到“同一功能有多种实现方式”的场景:比如电商的促销活动(满减/折扣/无优惠)、支付方式(支付宝/微信/信用卡)、日志记录(文件/数据库/控制台)。如果直接用if-else或switch硬编码,代码会变得臃肿且难以维护——新增一种实现方式需要修改原有逻辑,违反“开闭原则”。本文将聚焦策略模式(Strategy Pattern),这是专门解决此类问题的设计模式,覆盖其核心原理、Java实现、优缺点分析及真实项目中的适用场景。

Java大师兄的博客 1336

Java特性之设计模式【策略模式】

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式

Vinjcent 1万+

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 493

Java 策略模式( Strategy Pattern)详解

Java 设计模块之策略模式

小雨点的博客 1858

FTViewSE利用VB脚本制作简易日报表

罗克韦尔SE用VB做的简单的报表

z0800656的博客 3024

hfss仿真软件入门教程

hfss仿真软件入门教程 1.模型建立 1.1在project种选择insert hfss design 1.2.在hfss-》solution type 中选择modal 1.3.在moderler-》中选择units 设置单温为mm 1.4进行画图操作,这里为提高效率直接导入一个已经画好的cad图。使用modeler-》import 2.设置端口 2.1在更改模型中的材料 选择需要更改材料...

xunshui2007的博客 3万+

策略模式

实际使用各种支付时,各自的参数必然不一样,但是策略又是接口定义好的,那应该怎么办呢,这时介于客户端和策略方法中间的上下文类就发挥作用了,可以在这里面搞点小动作,把微信和支付宝用到的参数声明在这里,然后把自己传给策略类,不同的策略类需要什么参数就取什么参数。根据前面的示例会发现,策略模式的一系列策略算法是平等的,是可以互换的,写在一起就是通过if-else结构来组织,如果此时具体的算法实现中又有条件语句,就构成了多重条件语句,使用策略模式能避免这样的多重条件语句。策略模式的本质:分离算法,选择实现。

Filwaod 1973

2021-10-29 atcoder ABC157——B - Bingo

B - Bingo 先标记,然后暴力判断,这样最清晰最好想。 #include<iostream> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; int a[110][110],b[110]; int main() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) cin>>a[i]

honeistbutter的博客 339

[设计模式- 行为模式(11种)-03策略模式]

[设计模式- 行为模式(11种)-03策略模式]

m0_61164038的博客 569

西门子 S7-200 SMART 系列六:手把手教你配置S7-200 SMART Modbus RTU

最新发表:https://www.ics-pedia.com/%e8%a5%bf%e9%97%a8%e5%ad%90-s7-200-smart-%e7%b3%bb%e5%88%97%e5%85%ad%ef%bc%9a%e6%89%8b%e6%8a%8a%e6%89%8b%e6%95%99%e4%bd%a0%e9%85%8d%e7%bd%aes7-200-smart-modbus-rtu%e5%ae%9e%e4%be%8b/

John_09040211的博客 3283

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

AI 时代嵌入式工程师的能力模型与学习路线:全系列收官

weixin_42162924的博客 40

Java设计模式—策略模式(Strategy Mode)

策略模式(Strategy Mode)是一种行为型设计模式,它定义了算法家族,分别的封装起来,让它们之间可以相互替换;此模式让算法的变化,不会影响到使用算法的客户;这样做的好处是,当我们需要增加新的算法时,只需要添加一个新的算法类即可,而不需要修改原有的代码。策略模式是一种非常灵活和可扩展的设计模式,可以帮助我们更好地应对需求变化和提高代码质量。

是个非常热爱生活、乐观、奋斗、努力的逗比青年 3450

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】Caliper从0到使用

技能大赛样题解析,caliper题目从0到使用

weixin_52865146的博客 2081

【西瓜带你学设计模式 | 第十五期 - 策略模式】策略模式 —— 算法封装与动态替换实现、优缺点与适用场景

本文讲解了策略模式将可变算法封装为独立策略,通过统一接口实现动态替换,消除大量 if/else 分支,解耦算法与业务逻辑,适用于多规则切换、易扩展的场景。

无籽西瓜a的博客 736

【30天从零玩转AI应用开发】第16篇:智能体Agent入门——ReAct框架原理+首个会思考、会动手的AI实战

摘要: 本文介绍了AI智能体(Agent)的核心概念及其与普通大模型(LLM)的区别。通过ReAct(Reason+Act)框架,智能体实现了自主思考、调用工具和分步执行的能力。文章详细讲解了LangChain Agent的四大组件,并推荐新手使用ZERO_SHOT_REACT_DESCRIPTION类型。最后提供了一个完整的智能体实战代码示例,该智能体具备数学计算和天气查询功能,能够自主选择工具完成任务,展示了AI从”被动回答“到”主动行动“的关键进化。

在上海谋生的软件喵记录喵生 626

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

设计模式之策略模式

策略模式是一种面向对象设计模式,它允许在运行时选择算法的行为。这种模式使得可以定义一系列算法,并将每种算法封装起来,使它们可以相互替换,而不会影响到使用这些算法的客户端。策略模式的主要角色如下。我自己的理解:策略模式是在我们对一件事情实现的方法(策略),比如说要去西安旅行,去的方式有飞机、火车、大巴、自驾等。这些出行方式就是一个个不同的策略,可以根据自己的需求选择合适的策略。去的行为我们可以抽象成一个策略,然后去的方式是具体的策略,环境就是提供给我们选择的。

news_Q的博客 1744

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

设计模式|策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它允许在运行时选择算法的行为。它定义了一系列算法,将每个算法封装起来,并且使它们可以互相替换。策略模式可以使算法独立于使用它的客户端而变化。

weixin_44435110的博客 1435

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

一、策略模式简介、 二、策略模式适用场景、 三、策略模式优缺点、 四、策略模式与其它设计模式、 五、策略模式代码示例、 1、促销策略接口、 2、满减促销策略、 3、返现促销策略、 4、空促销策略、 5、促销策略工厂、 6、促销活动、 7、测试类、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1万+

设计模式-策略模式-Strategy Pattern

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以互换使用,算法的变化不会影响使用算法的用户。策略模式的优点包括算法的封装和切换的灵活性,以及算法可独立于使用它的客户端变化。:如果算法的实现非常复杂,或者算法可能会随着时间而变化,策略模式可以帮助管理这种复杂性,使得算法的变化不会影响到使用算法的代码。:在需要根据不同条件动态切换算法的场景中,策略模式可以提供灵活的算法切换机制,例如,根据输入数据的特性选择不同的算法。

wesigj的博客 1458

Java设计模式之《策略模式》

策略模式是一种行为设计模式,通过封装不同算法为独立策略类,使它们可以动态切换。该模式的优点包括避免多重条件判断、易于扩展且符合开闭原则,但缺点是需要客户端了解所有策略类。与工厂模式相比,策略模式侧重算法选择而非对象创建。文中以计算器应用为例,展示了如何通过策略接口、具体策略实现和上下文类实现加减乘除运算的动态切换。这种模式特别适用于需要频繁变更算法的场景,提高了代码的灵活性和可维护性。

weixin_50055999的博客 1075

瑞_23种设计模式_策略模式

本文章为瑞_系列专栏之《23种设计模式》的策略模式篇。工厂模式结合策略模式可以替换 if-else 语句。策略模式主要目的是避免使用多重条件语句,并将算法的实现从使用算法的客户端代码中分离出来。在策略模式(Strategy Pattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

阿瑞——从事Java后端,喜欢研读源码、自研框架、分享经验 2992

设计模式-策略模式

111

排长性感的小屁屁 1900

设计模式详解之策略模式

策略模式是一种应用广泛的行为型模式,核心思想是对算法进行封装,委派给不同对象来管理,本文将着眼于策略模式进行分享。

阿里技术 5815

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

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

ProgramNovice的博客 1939

C++ 设计模式-策略模式

策略模式的介绍和使用

wangdamingll的博客 2569

设计模式之 策略模式

策略模式(Strategy Pattern)是中的一种,它定义了一系列算法(或策略),并将每一个算法封装起来,使它们可以互换。策略模式允许客户端在运行时选择使用不同的算法,而不需要修改客户端的代码。这种模式让不同的算法可以独立变化、易于扩展,并且能够避免使用多重条件语句(如if-else)来选择特定的算法或操作。

2403_82445975的博客 953
上一篇: 带你认识设计模式的【责任链模式】及优缺点
下一篇: 5000字带你玩转MySQL获取时间、格式转换
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值