登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
每日签到
每天签到奖励2圆-6圆
发帖说明
VIP申请
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
VIP申请
VIP网盘
网盘
联系我们
每日签到
道具
勋章
任务
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
【设计模式】告别冗长if-else语句:使用策略模式优化代 ...
【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
[ 复制链接 ]
毋献仪
2025-6-2 00:07:26
概述
先看下面的图片,我们去旅游选择出行模式有很多种,可以骑自行车、可以坐汽车、可以坐火车、可以坐飞机。
作为一个程序猿,开发需要选择一款开发工具,当然可以进行代码开发的工具有很多,可以选择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
相关帖子
告别命令行!一个开源的 Docker 容器可视化管理工具!
告别无效催活,项目管理工具3招破解协作困局
告别堡垒机时代!某电力公司如何用CloudQuery解决2000+数据库的安全困局?
【OceanBase Agent】告别繁琐手动分析,OceanBase Agent 助力轻松运维数据库!
《我用AI打造了一个“数字的我”,它帮我看清自己,从此告别选择困难症》
告别 DOM 的旧时代:从零重塑 Web 渲染的未来
告别复杂配置!使用 1Panel 运行环境功能轻松搭建 Java 应用
告别复杂配置!使用 1Panel 运行环境功能轻松搭建 Java 应用
设计模式之单例模式
告别文档搜索与同事打扰:Augment AI 聊天 + 200K 上下文全方位助力开发
vip免费申请,1年只需15美金$
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
安全
告别命令行!一个开源的 Docker 容器可视化管理工具!
0
131
虾氲叱
2025-07-25
安全
告别无效催活,项目管理工具3招破解协作困局
0
362
圣罩
2025-07-25
业界
告别堡垒机时代!某电力公司如何用CloudQuery解决2000+数据库的安全困局?
0
713
琦谓
2025-07-28
科技
【OceanBase Agent】告别繁琐手动分析,OceanBase Agent 助力轻松运维数据库!
0
889
荆邦
2025-08-05
业界
《我用AI打造了一个“数字的我”,它帮我看清自己,从此告别选择困难症》
0
516
遗憩
2025-08-13
业界
告别 DOM 的旧时代:从零重塑 Web 渲染的未来
0
900
曲愍糙
2025-08-20
业界
告别复杂配置!使用 1Panel 运行环境功能轻松搭建 Java 应用
0
831
颖顿庐
2025-08-20
业界
告别复杂配置!使用 1Panel 运行环境功能轻松搭建 Java 应用
0
509
云卦逾
2025-08-20
安全
设计模式之单例模式
0
77
颖顿庐
2025-09-03
科技
告别文档搜索与同事打扰:Augment AI 聊天 + 200K 上下文全方位助力开发
0
94
訾颀秀
2025-09-08
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
毋献仪
2025-6-2 00:07:26
关注
0
粉丝关注
12
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
敖可
9984
杭环
9988
凶契帽
9988
4
氛疵
9988
5
黎瑞芝
9988
6
猷咎
9986
7
里豳朝
9986
8
肿圬后
9986
9
蝓俟佐
9984
10
虽裘侪
9984
查看更多