当前位置:网站首页>行为型模式-策略模式
行为型模式-策略模式
2022-08-02 09:50:00 【vbirdbest】
定义
角色
- 抽象策略(Strategy)类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
- 具体策略(Concrete Strategy)类:实现了抽象策略定义的接口,提供具体的算法实现或行为。
- 环境(Context)类:持有一个策略类的应用,最终给客户端调用。
案例
针对不同的节日退出不同的促销活动。
public interface Strategy {
public void show();
}
/** * 具体策略类 */
public class StrategyA implements Strategy {
@Override
public void show() {
System.out.println("买一赠一");
}
}
/** * 具体策略类 */
public class StrategyB implements Strategy {
@Override
public void show() {
System.out.println("满100减50");
}
}
/** * 上下文环境 */
public class SalesMan {
// 聚合策略类对象
private Strategy strategy;
public SalesMan(Strategy strategy) {
this.strategy = strategy;
}
// 调用具体的策略
public void showPromotion() {
strategy.show();
}
public Strategy getStrategy() {
return strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
}
public class Client {
public static void main(String[] args) {
SalesMan salesMan = new SalesMan(new StrategyA());
salesMan.showPromotion();
}
}
优缺点
优点:
策略类之间可以自由切换:由于策略类都实现了同一个接口,所以他们之间可以自由切换。(本来就是实现类实现接口,多态本来都可以自由切换,这也不只是策略特有的)。
易于扩展:增加一个新的实现只需要添加一个具体的策略类即可,基本上不需要改变原有的代码,符合开闭原则。(增加新的实现类对原程序本来影响就小,这就是多态的特性)
避免使用多重条件选择语句(if else),充分体现面向对象设计思想。只是将原本的if else 分支的代码进一步向上抽象到类中,使得整体if else 代码简洁了而已,仍然去不掉if else,想去掉还要靠其它方式。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式或造成产生很多个策略类,可以通过使用享元模式在一定程度上减少对象的数量。
使用场景
- 一个系统需要动态的在几种算法中选择一种时,可将每个算法封装到策略类中。
- 一个类定义了多种行为,并且这些行为在这个类的操作中可以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类找那个以代替这些条件语句。
- 系统中各算法彼此独立,且要求对客户隐藏具体的算法的实现细节。
边栏推荐
- Implementation of mysql connection pool
- LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之一:解题思路
- 1对1视频源码——快速实现短视频功能提升竞争力
- 让电商运营10倍提效的自动化工具,你get了吗?
- The R language uses the ggtexttable function of the ggpubr package to visualize the table data (draw the table directly or add the table data to the image), set the theme parameter to customize the fi
- 读博一年后对机器学习工程的思考
- 新“内卷”席卷科技圈,Google CEO 要求 174000 员工提高工作效率!
- leetcode 62. Unique Paths(独特的路径)
- 日元疲软令游戏机在日本变身“理财产品”:黄牛大赚
- Two-dimensional array piecemeal knowledge sorting
猜你喜欢
理解JS的三座大山
node制作一个视频帧长图生成器
Verilog的随机数系统任务----$random
SAP 云平台上一种 Low Code Development(低代码开发)解决方案
转转反爬攻防战
iNFTnews | 看见元宇宙的两面,何谓全真互联网和价值互联网?
Linux system uninstall, install, upgrade, migrate clickHouse database
重磅大咖来袭!阿里云生命科学与智能计算峰会精彩内容剧透
周鸿祎称微软抄袭 360 安全模式后发文否认;英特尔CEO基辛格回应市值被AMD超越:股价下跌是咎由自取|极客头条...
软件测试之发现和解决bug
随机推荐
记某社区问答
李航《统计学习方法》笔记之k近邻法
【OpenCV】-霍夫变换
你认同这个观点吗?大多数企业的数字化都只是为了缓解焦虑
AutoJs学习-实现谢尔宾斯基三角
【新版干货书】深度伪造 (DeepFakes):创造,检测和影响
yolov7 innovation point
【技术分享】OSPFv3基本原理
Naive Bayesian Method of Li Hang's "Statistical Learning Methods" Notes
node制作一个视频帧长图生成器
system_error错误处理库学习
R语言使用ggpubr包的ggtexttable函数可视化表格数据(直接绘制表格图或者在图像中添加表格数据)、设置theme主题参数自定义表格中表头内容的填充色(使用colnames.style参数)
DVWA 通关记录 2 - 命令注入 Command Injection
众城优选系统开发功能
【云原生】快出数量级的性能是怎样炼成的?就提升了亿点点
Chapter 15 Generics
Weak yen turns game consoles into "financial products" in Japan: scalpers make big profits
R language ggplot2 visualization: use the ggtexttable function of the ggpubr package to visualize tabular data (directly draw tabular graphs or add tabular data to images), use tbody_add_border to add
重磅大咖来袭!阿里云生命科学与智能计算峰会精彩内容剧透
Shell script realizes multi-select DNS simultaneous batch resolution of domain name IP addresses (new update)