登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
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
相关帖子
告别 LaTeX 配置地狱:我的 Overleaf (ShareLaTeX-CE) 完整版私有化部署方案
软件设计模式系列之四——简单工厂模式
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
【GitHub每日速递 250929】告别手动查资料
告别漫长GC停顿:深入解析G1如何实现可预测的毫秒级响应
告别人工干预!C# 轻量级上位机自动联动 MES 与视觉检测
Go语言实现GoF设计模式:适配器模式
告别盲人摸象,数据分析的抽样方法总结
Apipost 自动化测试实战:用 IF 控制器实现“增删改查”依赖链
Flask数据库操作进阶:告别裸写SQL,用ORM提升开发效率
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
告别 LaTeX 配置地狱:我的 Overleaf (ShareLaTeX-CE) 完整版私有化部署方案
6
889
簧横
2025-10-06
安全
软件设计模式系列之四——简单工厂模式
2
1074
愆蟠唉
2025-10-10
安全
解析设计模式与设计原则:构建可维护性和可扩展性代码的重要性
3
545
涂流如
2025-10-11
业界
【GitHub每日速递 250929】告别手动查资料
2
1009
揿纰潦
2025-10-31
业界
告别漫长GC停顿:深入解析G1如何实现可预测的毫秒级响应
2
802
静轾
2025-11-05
业界
告别人工干预!C# 轻量级上位机自动联动 MES 与视觉检测
2
598
井晶灵
2025-11-13
安全
Go语言实现GoF设计模式:适配器模式
3
483
柩通奉
2025-11-19
业界
告别盲人摸象,数据分析的抽样方法总结
1
286
曲愍糙
2025-11-29
业界
Apipost 自动化测试实战:用 IF 控制器实现“增删改查”依赖链
3
88
乳杂丫
2025-12-02
业界
Flask数据库操作进阶:告别裸写SQL,用ORM提升开发效率
0
1015
滤冽
2025-12-09
回复
(2)
柄利
2025-11-4 09:35:03
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
东西不错很实用谢谢分享
向梦桐
2025-11-12 03:11:55
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
鼓励转贴优秀软件安全工具和文档!
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
浏览过的版块
科技
代码
安全
签约作者
程序园优秀签约作者
发帖
毋献仪
2025-11-12 03:11:55
关注
0
粉丝关注
14
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845357
3934307807
991123
4
xiangqian
638210
5
韶又彤
9998
6
宋子
9983
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
361
爬虫专栏:破解网站检测selenium反爬——“
833
开源项目分享:Gitee热榜项目 2025年12月第
49
意识的自反性:知者与作者之惑
680
docker学习笔记
763
docker学习笔记
683
咱们聊聊Spring循环依赖那点事儿:从“死锁
156
Python学习3
832
NCHU-数字电路模拟程序-23207332
234
LaTeX学习笔记:学术文档排版
217
昆明黄金店推荐:如何甄选“价值平权”的黄
936
微信支付集成_JSAPI
882
【AI编程】5分钟用AI复刻有BOSS战的《坦克
627
紧跟材料趋势,深耕专业工艺:上海芮生建设
665
FFmpeg开发笔记(九十四)基于Kotlin的国产
743
昆明旅游打卡必去:逛南亚风情园,别错过廖
881
大厂生存启示录:从“螺丝钉”到“金牌个人
217
AI编程工具策略
265
self introduction
53
白嫖最新ChatGPT和主流AI大模型,国内无限
70
Java关键字解析之volatile:可见性的守护者