当前位置:网站首页>行为型模式-策略模式
行为型模式-策略模式
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,想去掉还要靠其它方式。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式或造成产生很多个策略类,可以通过使用享元模式在一定程度上减少对象的数量。
使用场景
- 一个系统需要动态的在几种算法中选择一种时,可将每个算法封装到策略类中。
- 一个类定义了多种行为,并且这些行为在这个类的操作中可以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类找那个以代替这些条件语句。
- 系统中各算法彼此独立,且要求对客户隐藏具体的算法的实现细节。
边栏推荐
- CFdiv2-The Number of Imposters-(两种点集图上染色问题总结)
- Have you ever learned about these architecture designs and architecture knowledge systems?(Architecture book recommendation)
- R语言时间序列数据的平滑:使用KernSmooth包的dpill函数和locpoly函数对时间序列数据进行平滑以消除噪声
- 迭代器失效问题
- js防抖函数和函数节流的应用场景
- 基于列表的排队与叫号系统
- npm ERR! 400 Bad Request - PUT xxx - Cannot publish over previously published version “1.0.0“.
- node封装一个图片拼接插件
- QT专题:自定义部件
- 【OpenCV】-霍夫变换
猜你喜欢
随机推荐
Smoothing of time series data in R language: smoothing time series data to remove noise using the dpill function and locpoly function of the KernSmooth package
新“内卷”席卷科技圈,Google CEO 要求 174000 员工提高工作效率!
理解JS的三座大山
R语言ggpubr包的ggbarplot函数可视化分组柱状图、设置add参数为mean_se可视化不同水平均值的柱状图并为柱状图添加误差线(se标准误差)、position参数自定义分组柱状图分离
单词接龙 II
关于缓存数据的探讨
R language ggplot2 visualization: use the ggbarplot function of the ggpubr package to visualize the horizontal column chart (bar chart), use the orientation parameter to set the column chart to be tra
php组件漏洞
中国发布丨滴滴因违反网络安全法等被罚80.26亿元!调查细节公布
Application scenarios of js anti-shake function and function throttling
第十七章 Excel操作
用了TCP协议,就一定不会丢包嘛?
It's time for bank data people who are driven crazy by reporting requirements to give up using Excel for reporting
读博一年后对机器学习工程的思考
iNFTnews | 看见元宇宙的两面,何谓全真互联网和价值互联网?
In the whole development of chi V853 board tried to compile QT test
干货|如何在海量文件系统中选择合适自己的文件系统
享年94岁,图灵奖得主、计算复杂性理论先驱Juris Hartmanis逝世
周鸿祎称微软抄袭 360 安全模式后发文否认;英特尔CEO基辛格回应市值被AMD超越:股价下跌是咎由自取|极客头条...
function call to print lua internal structure