登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
【设计模式】告别冗长if-else语句:使用策略模式优化代 ...
【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
[ 复制链接 ]
毋献仪
2025-6-2 00:07:26
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
概述
先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。
作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择Idea进行开发,也可以使用eclipse进行开发,也可以使用其他的一些开发工具。
定义
:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
结构
策略模式的主要角色如下:
抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
环境(Context)类:持有一个策略类的引用,最终给客户端调用。
案例实现
【例】促销活动
一家百货公司在定年度的促销活动。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。类图如下:
代码如下:
定义百货公司所有促销活动的共同接口
public interface Strategy {
void show();
}
复制代码
定义具体策略角色(Concrete Strategy):每个节日具体的促销活动
//为春节准备的促销活动A
public class StrategyA implements Strategy {
public void show() {
System.out.println("买一送一");
}
}
//为中秋准备的促销活动B
public class StrategyB implements Strategy {
public void show() {
System.out.println("满200元减50元");
}
}
//为圣诞准备的促销活动C
public class StrategyC implements Strategy {
public void show() {
System.out.println("满1000元加一元换购任意200元以下商品");
}
}
复制代码
定义环境角色(Context):用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员
public class SalesMan {
//持有抽象策略角色的引用
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
//向客户展示促销活动
public void salesManShow(){
strategy.show();
}
}
复制代码
优缺点
优点:
策略类之间可以自由切换:由于策略类都实现同一个接口,所以使它们之间可以自由切换。
易于扩展:增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码,符合“开闭原则“
避免使用多重条件选择语句(if else),充分体现面向对象设计思想。
缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
策略模式将造成产生很多策略类,可以通过使用享元模式在一定程度上减少对象的数量。
使用场景
一个系统需要动态地在几种算法中选择一种时,可将每个算法封装到策略类中。
一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类中以代替这些条件语句。
系统中各算法彼此完全独立,且要求对客户隐藏具体算法的实现细节时。
系统要求使用算法的客户不应该知道其操作的数据时,可使用策略模式来隐藏与算法相关的数据结构。
多个类只区别在表现行为不同,可以使用策略模式,在运行时动态选择具体要执行的行为。
源码解析 - Comparator
Comparator 中的策略模式。在Arrays类中有一个 sort() 方法,如下:
[code]public class Arrays{ public static void sort(T[] a, Comparator
设计模式
告别
冗长
if
else
相关帖子
软件设计模式系列之四——简单工厂模式
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
【GitHub每日速递 250929】告别手动查资料
告别漫长GC停顿:深入解析G1如何实现可预测的毫秒级响应
告别人工干预!C# 轻量级上位机自动联动 MES 与视觉检测
Go语言实现GoF设计模式:适配器模式
告别盲人摸象,数据分析的抽样方法总结
Apipost 自动化测试实战:用 IF 控制器实现“增删改查”依赖链
Flask数据库操作进阶:告别裸写SQL,用ORM提升开发效率
告别“草率编程”:Vibe Engineering 如何重新定义资深工程师的护城河
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
软件设计模式系列之四——简单工厂模式
3
1079
愆蟠唉
2025-10-10
安全
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
3
549
涂流如
2025-10-11
业界
【GitHub每日速递 250929】告别手动查资料
2
1011
揿纰潦
2025-10-31
业界
告别漫长GC停顿:深入解析G1如何实现可预测的毫秒级响应
2
803
静轾
2025-11-05
业界
告别人工干预!C# 轻量级上位机自动联动 MES 与视觉检测
2
604
井晶灵
2025-11-13
安全
Go语言实现GoF设计模式:适配器模式
4
487
柩通奉
2025-11-19
业界
告别盲人摸象,数据分析的抽样方法总结
1
287
曲愍糙
2025-11-29
业界
Apipost 自动化测试实战:用 IF 控制器实现“增删改查”依赖链
3
92
乳杂丫
2025-12-02
业界
Flask数据库操作进阶:告别裸写SQL,用ORM提升开发效率
1
1027
滤冽
2025-12-09
业界
告别“草率编程”:Vibe Engineering 如何重新定义资深工程师的护城河
1
722
訾懵
2025-12-17
回复
(3)
柄利
2025-11-4 09:35:03
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
东西不错很实用谢谢分享
向梦桐
2025-11-12 03:11:55
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
鼓励转贴优秀软件安全工具和文档!
舒菀菀
前天 15:52
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
这个有用。
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
安全
签约作者
程序园优秀签约作者
发帖
毋献仪
前天 15:52
关注
0
粉丝关注
14
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
547
JSAPIThree 加载单体三维模型学习笔记:Sim
118
读捍卫隐私09匿名指南
68
工作中常用函数详解与示例-PostgreSQL(其他
585
很顶!零成本克隆你的声音,这款B站开源神
674
go语言/golang 自动升级配置
961
函数式编程与传统编程的对比——基于java
228
pgAdmin 后台命令执行漏洞复现及分析(CVE-
856
度假村亲子水上乐园设备哪家质量好?
282
上下文协议(MCP)Java SDK 指南
696
Mac办公效率翻倍?Charmstone教你玩转多任
774
深耕上海14年,专业防水补漏:如何为厂房、
826
【A】字符串
461
一个完全由大模型AI Coding开发而成的程序
699
【Ubuntu】Ubuntu+VScode+ESP-IDF 的环境搭
664
60 秒出高质量科研图!Gemini+DeepSeek 绘
781
追踪链路--使用iptables/ipvs来记录后端pod
160
【译】初探 Visual Studio 2026 全新的用户
322
建筑渗漏治理的标准化实践:基于上海芮生建
54
Aspire 13:从.NET 编排工具到真正的多语言
997
用 .NET 最小化 API 构建高性能 API