掌握设计模式--策略模式
创作时间:
作者:
@小白创作中心
掌握设计模式--策略模式
引用
1
来源
1.
https://www.cnblogs.com/dennyLee2025/p/18672246
策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,从而让算法的变化独立于使用它们的客户端代码。本文将从策略模式的定义、组成部分、代码示例、优缺点、适用场景以及与其他模式的对比等多个方面进行详细阐述。
策略模式(Strategy Pattern)
策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,从而让算法的变化独立于使用它们的客户端代码。策略模式的核心在于为算法的实现提供统一的接口,并通过动态选择具体实现来实现灵活性。
组成部分
- Context(上下文类): 持有对某个策略对象的引用,并定义客户端需要的接口,负责在运行时动态切换策略。
- Strategy(策略接口): 定义所有支持的算法的公共接口。
- ConcreteStrategy(具体策略实现): 实现Strategy接口的具体算法。
代码示例
以下是使用策略模式实现不同的支付方式的动态切换。信用卡支付和微信支付的动态切换。
类图
策略接口
// 策略接口
public interface PaymentStrategy {
void pay(int amount);
}
具体策略实现
// 具体策略实现 - 信用卡支付
public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println("交易金额 " + amount + " 使用的卡号: " + cardNumber);
}
}
// 具体策略实现 - 微信支付
public class WxPayment implements PaymentStrategy {
private String phoneNumber;
public WxPayment(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
@Override
public void pay(int amount) {
System.out.println("交易金额 " + amount + " 使用的手机号: " + phoneNumber);
}
}
上下文
// 上下文类
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void setStrategy(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
}
测试代码
public class StrategyPatternDemo {
public static void main(String[] args) {
// 使用信用卡支付
PaymentContext context = new PaymentContext(new CreditCardPayment("1234-5678-9012-3456"));
context.executePayment(100);
// 切换到Wx支付
context.setStrategy(new WxPayment("13112345678"));
context.executePayment(200);
}
}
测试结果
交易金额 100 使用的卡号: 1234-5678-9012-3456
交易金额 200 使用的手机号: 13112345678
优缺点和适用场景
优点
- 开放-封闭原则:新的策略可以在不修改现有代码的情况下添加。
- 提高代码灵活性:可以动态地在运行时选择算法。
- 消除冗长的条件分支:使用策略模式代替if-else或switch-case条件判断。
缺点
- 类的数量增加:每个策略需要定义一个类,可能导致类数量增多。
- 客户端需要知道所有策略:客户端必须了解策略的作用并选择合适的策略。
适用场景
- 多个算法只有在行为上稍有不同的情况下。
- 需要动态选择算法或者行为的情况下。
- 避免使用条件语句(if-else或switch-case)来管理算法时。
实际应用
- 数据加密算法选择(AES、RSA等)
- 数据压缩算法(ZIP、GZIP)
- 不同类型的文件解析(JSON、XML、YAML)
策略模式与其他模式的对比
- 状态模式:状态模式的行为是状态驱动的,而策略模式的行为是由客户端选择驱动的。
- 工厂模式:工厂模式用于创建对象,而策略模式关注的是行为的动态切换。
- 桥接模式:桥接模式侧重于分离抽象和实现及多维度的扩展;而策略模式用于封装算法或行为,单维度的扩展。
- 装饰模式:使用一系列装饰器类,通过组合的方式增强对象的功能。装饰器的核心在于“增强”。
- 策略模式:客户端在运行时选择合适的策略来完成特定任务。策略模式的核心在于“替换”。
总结
策略设计模式定义了一系列算法(策略),将每个算法封装到独立的策略类中,并通过上下文类动态地选择和使用不同的策略,从而让算法的变化独立于使用算法的客户端。
热门推荐
3D打印耗材哑光PLA详解
冬季,几天洗一次澡合适?怎样保湿更靠谱?
体谈丨从濒临解散到突破历史 中国花游队走过28年风雨羽化成蝶
花游集体自由自选中国队《万有引力》表现优异 69分优势领先美国领跑
高中文言文翻译技巧揭秘:助你轻松理解古文奥妙
七里香泡茶:正确方法与用途全解
汽车锂电池拆解过程中有机废气处理的技术路径与环保合规性分析
2024年9月公共英语三级大纲及考试题型介绍
臭名昭著的战争罪犯东条英机
新款笔记本选购宝典:从续航到屏幕,打造你的完美移动工作站!
服用中药期间,这些水果最好别碰
喝中药期间,这些水果最好别碰
燃气自闭阀使用指南:如何判断工作状态?
转折!反超!2024年惠州商品房成交超922万㎡ 新房/二手房这样表现
男命八字中四个食神的含义与影响
IP地址管理中的GDPR合规性
御史台:从古代监察机构到现代政治机构的角色演变
春天怎么穿才时髦?试试这些“风衣”的搭配示范,时髦显瘦更高级
别人帮了我怎么感谢:表达谢意的实用指南及应对不同场合的技巧!
如何解决投影仪投射距离过小的问题(调整投影距离)
汽车以旧换新,如何焕新二手车市
蚯蚓:隐秘而伟大的地下精灵
如何分析黄金的开采成本?这些成本如何影响黄金的价值?
太好逛!跟着央媒去元阳“赶大集”~
门牙疼痛是什么原因
朱祁镇在位期间的土木堡之变险些覆灭王朝,为何他的庙号为英宗?
交押金后不退可以申请劳动仲裁吗
赤藓糖醇代糖的危害是什么
广州旅游必去的十大步行街有哪些?广州旅游必去步行街排行榜前十
晏几道思念初恋情人,写下动人心扉的歌词,后两句堪称爱情千古绝唱