Java设计模式-策略模式(15)

简介: Java设计模式-策略模式(15)

Java中的策略模式(Strategy Pattern)是一种行为设计模式,它使你能在运行时改变对象的行为。在策略模式中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。

概念
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。

结构
策略模式主要包含以下角色:

1.策略接口(Strategy Interface):定义所有支持的策略或行为的公共接口。这是一个抽象类或接口,通常只有一个方法,用于执行算法。

2.具体策略类(Concrete Strategy Classes):实现了策略接口的类,每个类都代表一种具体的算法或行为。

3.上下文(Context):持有一个策略接口的引用。上下文不直接决定如何执行算法,而是将该责任委派给策略类。上下文可以在运行时根据需要切换策略。

优点
•算法的封装:每个算法都被封装在自己的类中,使得它易于修改和切换。

•开闭原则:允许你在不修改上下文的情况下添加新的策略。

•可互换性:运行时可以动态地改变对象的行为。

•减少条件语句:避免使用多分支条件语句(如if...else 或 switch...case),使得代码更加清晰和易于维护。

实现示例
下面是一个简单的策略模式实现示例,模拟不同支付策略:

// 策略接口
interface PaymentStrategy {
void pay(int amount);
}

// 具体策略类 - 信用卡支付
class CreditCardStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println(amount + " paid with credit/debit card");
}
}

// 具体策略类 - PayPal支付
class PayPalStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println(amount + " paid using PayPal.");
}
}
// 上下文类
class ShoppingCart {
private Listitems;
// 策略对象,通过构造器或setter注入
private PaymentStrategy paymentStrategy;

public void setPaymentStrategy(PaymentStrategy strategy) {          
    this.paymentStrategy = strategy;          
}          



public void checkout(int amount) {          
    paymentStrategy.pay(amount);          
}          

}
// 客户端代码
public class ShoppingCartTest {

public static void main(String[ ] args) {

ShoppingCart cart = new ShoppingCart();

// 设置支付策略为信用卡支付
cart.setPaymentStrategy(new CreditCardStrategy());
cart.checkout(100);

// 动态切换支付策略为PayPal支付
cart.setPaymentStrategy(new PayPalStrategy());
cart.checkout(200);
}
}

在这个例子中,PaymentStrategy 是策略接口,CreditCardStrategy 和 PayPalStrategy 是具体策略类,ShoppingCart 是上下文。客户端代码可以在运行时选择并切换支付策略,展示了策略模式的灵活性和扩展性。

应用场景分析
策略模式在软件开发中有着广泛的应用场景,尤其适合于以下几种情况:

1.多算法共存:当系统需要支持多种算法,并且这些算法可能在未来会增加或替换时,策略模式提供了一种灵活的解决方案。例如,在排序、过滤、加密等操作中,用户可以根据需求选择不同的算法策略。

2.运行时决策:当算法的选择需要在运行时根据条件或用户输入来决定时,策略模式能够方便地动态调整对象行为。比如,根据用户账户类型选择不同的计费策略。

3.避免复杂的条件判断:在传统编程中,可能会使用大量的if-else或switch-case语句来选择执行不同的逻辑。策略模式通过委托给具体策略类处理,大大简化了上下文类的复杂度,提高了代码的可读性和可维护性。

4.遵循开闭原则:在不修改原有代码的基础上,可以轻松添加新的策略,这符合面向对象设计中的开闭原则。新策略的加入不会影响到现有代码,降低了模块间的耦合度。

扩展与优化
组合策略
在某些场景下,单一策略可能不足以满足复杂的需求,可以考虑将多个策略组合起来使用。通过创建一个新的策略类,该类内部组合了多个基本策略,并在执行时按需调用,从而实现更复杂的逻辑处理。

策略工厂
为了进一步解耦,可以引入策略工厂模式来管理策略的创建过程。工厂类根据外部条件或配置信息决定实例化哪个具体策略类,这样上下文无需直接了解具体策略类的存在,进一步增强了系统的灵活性和扩展性。

动态策略加载
在一些高度可配置的应用中,策略甚至可以在应用运行期间动态加载和替换,例如通过反射机制或者依赖注入框架来实现。这种方式使得策略的更换无需重启应用,提升了系统的可运维性。

总结
策略模式通过将算法或行为的实现与使用分离,为软件设计提供了高度的灵活性和可扩展性。它不仅减少了代码间的耦合,还促进了代码的重用,是处理多变行为设计问题的一种优雅方式。在实际开发中,结合具体应用场景灵活运用策略模式,能够有效提升软件系统的质量和可维护性。

相关文章
|
6天前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
4月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
105 0
|
4月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
4月前
|
设计模式 算法 搜索推荐
【设计模式】【行为型模式】策略模式(Strategy)
一、入门 什么是策略模式? 策略模式是一种行为设计模式,允许在运行时选择算法或行为。它将算法封装在独立的类中,使得它们可以互换,而不影响客户端代码。 为什么需要策略模式? 策略模式的主要目的是解决算法
105 14
|
10月前
|
设计模式 算法 Kotlin
Kotlin - 改良设计模式 - 策略模式
Kotlin - 改良设计模式 - 策略模式
129 4
|
7月前
|
设计模式 算法 开发者
「全网最细 + 实战源码案例」设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,用于定义一系列可替换的算法或行为,并将它们封装成独立的类。通过上下文持有策略对象,在运行时动态切换算法,提高代码的可维护性和扩展性。适用于需要动态切换算法、避免条件语句、经常扩展算法或保持算法独立性的场景。优点包括符合开闭原则、运行时切换算法、解耦上下文与策略实现、减少条件判断;缺点是增加类数量和策略切换成本。示例中通过定义抽象策略接口和具体策略类,结合上下文类实现动态算法选择。
232 8
「全网最细 + 实战源码案例」设计模式——策略模式
|
6月前
|
设计模式 Java 数据安全/隐私保护
Java 设计模式:装饰者模式(Decorator Pattern)
装饰者模式属于结构型设计模式,允许通过动态包装对象的方式为对象添加新功能,提供比继承更灵活的扩展方式。该模式通过组合替代继承,遵循开闭原则(对扩展开放,对修改关闭)。
|
9月前
|
设计模式 存储 缓存
前端必须掌握的设计模式——策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,旨在将多分支复杂逻辑解耦。每个分支类只关心自身实现,无需处理策略切换。它避免了大量if-else或switch-case代码,符合开闭原则。常见应用场景包括表单验证、风格切换和缓存调度等。通过定义接口和上下文类,策略模式实现了灵活的逻辑分离与扩展。例如,在国际化需求中,可根据语言切换不同的词条包,使代码更加简洁优雅。总结来说,策略模式简化了多条件判断,提升了代码的可维护性和扩展性。
|
10月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
168 6
|
10月前
|
设计模式 算法 Kotlin
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
Kotlin教程笔记(53) - 改良设计模式 - 策略模式
98 1