当前位置:网站首页>行为型模式-策略模式
行为型模式-策略模式
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,想去掉还要靠其它方式。
缺点
- 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
- 策略模式或造成产生很多个策略类,可以通过使用享元模式在一定程度上减少对象的数量。
使用场景
- 一个系统需要动态的在几种算法中选择一种时,可将每个算法封装到策略类中。
- 一个类定义了多种行为,并且这些行为在这个类的操作中可以多个条件语句的形式出现,可将每个条件分支移入它们各自的策略类找那个以代替这些条件语句。
- 系统中各算法彼此独立,且要求对客户隐藏具体的算法的实现细节。
边栏推荐
猜你喜欢
随机推荐
后管实现面包屑功能
Weak yen turns game consoles into "financial products" in Japan: scalpers make big profits
mysql连接池的实现
软件测试之发现和解决bug
CFdiv2-The Number of Imposters-(两种点集图上染色问题总结)
HikariCP database connection pool, too fast!
The k-nearest neighbor method in the notes of Li Hang's "Statistical Learning Methods"
Long battery life or safer?Seal and dark blue SL03 comparison shopping guide
AutoJs学习-AES加解密
C语言volatile关键字、内嵌汇编volatile与编译器的爱恨情仇
周鸿祎称微软抄袭 360 安全模式后发文否认;英特尔CEO基辛格回应市值被AMD超越:股价下跌是咎由自取|极客头条...
R语言ggplot2可视化:使用ggpubr包的ggbarplot函数可视化堆叠的柱状图(stacked bar plot)、lab.pos参数指定柱状图的数值标签的位置,lab.col参数指定数值标
node封装一个图片拼接插件
稳定币:对冲基金做空 Tether 的结局会是什么?
一文带你了解推荐系统常用模型及框架
ConvNeXt论文及实现
function call to print lua internal structure
typeinfo类型支持库学习
The heavyweights are coming!Spoilers for the highlights of the Alibaba Cloud Life Science and Intelligent Computing Summit
R语言时间序列数据算术运算:使用log函数将时间序列数据的数值对数化、使用diff函数计算对数化后的时间序列数据的逐次差分(计算价格的对数差分)









