JAVA设计模式14:策略模式,使算法的变化独立于使用它的客户端

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: JAVA设计模式14:策略模式,使算法的变化独立于使用它的客户端

一、什么是策略模式

策略模式是一种软件设计模式,它定义了一系列算法,将每个算法都封装起来,并且使它们可以互相替换。策略模式可以使算法的变化独立于使用它的客户端。

在策略式中,通常会有一个抽象策略接口,它定义了一个公共的方法或操作,具体的策略类实现了该接口,并提供不同的算法实现。客户端类(Context)持有一个策略对象,并根据需要调用策对象的方法来执行具体的算法。

使用策略模式的好处是可以在不修改客户端的情况下,动态地改变算法的实现,提高了代码的灵活性和可扩展性。同时,策略模式也符合单一职责原则,每个体策略类只负责一个算法的实现,使代码更加清晰易懂。

在 Java 语言中,策略模式可以通过接口和实现类的方式来实现,也可以通过函数式接口和 Lambda 表达式的方式来实现。无论采用哪种方式,策略式都可以帮助我们实现算法的动态切换和灵活性设计。


二、策略模式实例

下面是一个使用策略模式的 Java 示例代码,请同学们认真学习。

首先,我们定义一个策略接口 PaymentStrategy,它包含一个 pay 方法用于支付操作:

public interface PaymentStrategy {
    void pay(double amount);
}

然后,我们实现两个具体的策略类 CreditCardStrategyPayPalStrategy,分别实现了 PaymentStrategy 接口:

public class CreditCardStrategy implements PaymentStrategy {
    private String cardNumber;
    private String cvv;
    private String expirationDate;
    public CreditCardStrategy(String cardNumber, String cvv, String expirationDate) {
        this.cardNumber = cardNumber;
        this.cvv = cvv;
        this.expirationDate = expirationDate;
    }
    public void pay(double amount) {
        System.out.println("Paid $" + amount + " using credit card.");
    }
}
public class PayPalStrategy implements PaymentStrategy {
    private String email;
    private String password;
    public PayPalStrategy(String email, String password) {
        this.email = email;
        this.password = password;
    }
    public void pay(double amount) {
        System.out.println("Paid $" + amount + " using PayPal.");
    }
}

接下来,我们创建一个上下文类 PaymentContext,它持有一个 PaymentStrategy 对象,并提供了一个 pay 方法用于执行支付操作,代码如下。

public class PaymentContext {
    private PaymentStrategy paymentStrategy;
    public PaymentContext(PaymentStrategy paymentStrategy) {
        this.paymentStrategy = paymentStrategy;
    }
    public void payAmount(double amount) {
        paymentStrategy.pay(amount);
    }
}

最后,我们使用策略模式来进行支付操作,代码如下。

public class Main {
    public static void main(String[] args) {
        // 创建一个上下文对象,指定使用CreditCardStrategy策略
        PaymentContext context = new PaymentContext(new CreditCardStrategy("123456789", "123", "12/23"));
        context.payAmount(100.0);
        // 创建一个上下文对象,指定使用PayPalStrategy策略
        context = new PaymentContext(new PayPalStrategy("test@example.com", "password"));
        context.payAmount(50.0);
    }
}

以上示例代码演示了策略模式在 Java 中的使用,通过定义不同的策略类,并上下文对象中动态切换策略,可以实现不同的支付方式。

这样,我们可以方便地扩展和修改支付策略,而无需修改客户端代码。


三、策略模式的应用场景

策略模式在Java中有许多应用场景,以下是一些常见的例子,请同学们认真学习。

  1. 算法选择:当需要根据不同的条件或情况选择不同的算法时,策略模式可以提供一种灵活的方式来实现。例如,根据不同的排序要求选择不同的排序算法,或者根据不同的支付方式选择不同的支付策略。
  2. 表单验证:在表单验证中,可以使用策略模式来实现不同的验证规则。例如,对于不同的字段,可以使用不同的验证策略进行验证,如手机号码验证、邮箱验证、密码强度验证等。
  3. 缓存策略:在缓存系统中,可以使用策略模式来定义不同的缓存策略。例如,可以根据访问频率、数据有效期等条件选择合适的缓存策略,如 LRU(最近最少使用)、LFU(最不经常使用)等。
  4. 日志输出:在日志输出中,可以使用策略模式来选择不同的日志输出策略。例如,可以根据日志级别选择将日志输出到文件、控制台、数据库等不同的目标。
  5. 策略游戏:在策略游戏中,可以使用策略模式来实现不同的战略和策略。例如,根据不同的敌人类型选择不同的攻击策略,或者根据不同的地形选择不同的行军策略。

这些是常见的应用场景,策略模式在实际开发中还有许多其他应用。总的来说,策略模式适用于需要在运行时动态切换算法或行为的情况,可以提高代码的灵活性和可扩展性。


四、策略模式面试题

1.什么是策略模式?它的作用是什么?

答:策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装成独立的策略类,使得它们可以互相替换。策略模式的作用是在运行时根据需求动态选择算法,提高代码的灵活性和可维护性。

2.策略模式的组成部分有哪些?

答:策略模式由三个主要组成部分组成,分别是策略接口,具体策略类和上下文类。策略接口定义了策略类需要实现的方法,具体策略类实现了策略接口的方法,上下文类持有一个策略对象,并根据需要调用策略对象的方法。

3.策略模式和工厂模式的区别是什么?

答:策略模式和工厂模式都是常见的设计模式,但它们解决的问题和使用场景有所不同。策略模式解决的问题是动态选择算法,针对不同的情况选择不同的策略。而工厂模式解决的是对象的创建问题,通过工厂类来创建对象,隐藏了具体的实现细节。简单来说,策略模式关注的是算法的选择,而工厂模式关注的是对象的创建。

4.策略模式的优缺点是什么?

答:策略模式的优点包括灵活性高,可扩展性好,算法的变化独立于使用它的客户端。策略模式的缺点是增加了类的数量,每个具体策略类都需要单独实现一个策略接口,增加了代码的复杂度。

5.策略模式和状态模式有什么区别?

答:策略模式和状态模式都是行为型设计模式,它们的区别在于目的和使用场景。策略模式是为了实现不同的算法选择,根据不同的条件选择不同的策略。而状态模式是为了实现对象状态的变化,根据对象的状态选择不同的行为。简单来说,策略模式关注的是算法的切换,而状态模式关注的是对象状态的变化。

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
5月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
24天前
|
设计模式 人工智能 算法
基于多设计模式的状态扭转设计:策略模式与责任链模式的实战应用
接下来,我会结合实战案例,聊聊如何用「策略模式 + 责任链模式」构建灵活可扩展的状态引擎,让抽奖系统的状态管理从「混乱战场」变成「有序流水线」。
|
5月前
|
存储 缓存 监控
上网行为监控系统剖析:基于 Java LinkedHashMap 算法的时间序列追踪机制探究
数字化办公蓬勃发展的背景下,上网行为监控系统已成为企业维护信息安全、提升工作效能的关键手段。该系统需实时记录并深入分析员工的网络访问行为,如何高效存储和管理这些处于动态变化中的数据,便成为亟待解决的核心问题。Java 语言中的LinkedHashMap数据结构,凭借其独有的有序性特征以及可灵活配置的淘汰策略,为上网行为监控系统提供了一种兼顾性能与功能需求的数据管理方案。本文将对LinkedHashMap在上网行为监控系统中的应用原理、实现路径及其应用价值展开深入探究。
115 3
|
5月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
215 0
|
5月前
|
设计模式 缓存 安全
【高薪程序员必看】万字长文拆解Java并发编程!(8):设计模式-享元模式设计指南
🌟 ​大家好,我是摘星!​ 🌟今天为大家带来的是并发编程中的经典对象复用设计模式-享元模式,废话不多说让我们直接开始。
116 0
|
4月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
360 58
|
5月前
|
人工智能 Java API
MCP客户端调用看这一篇就够了(Java版)
本文详细介绍了MCP(Model Context Protocol)客户端的开发方法,包括在没有MCP时的痛点、MCP的作用以及如何通过Spring-AI框架和原生SDK调用MCP服务。文章首先分析了MCP协议的必要性,接着分别讲解了Spring-AI框架和自研SDK的使用方式,涵盖配置LLM接口、工具注入、动态封装工具等步骤,并提供了代码示例。此外,还记录了开发过程中遇到的问题及解决办法,如版本冲突、服务连接超时等。最后,文章探讨了框架与原生SDK的选择,认为框架适合快速构建应用,而原生SDK更适合平台级开发,强调了两者结合使用的价值。
7381 33
MCP客户端调用看这一篇就够了(Java版)
|
3月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
122 1
|
5月前
|
设计模式 算法 Java
设计模式觉醒系列(04)策略模式|简单工厂模式的升级版
本文介绍了简单工厂模式与策略模式的概念及其融合实践。简单工厂模式用于对象创建,通过隐藏实现细节简化代码;策略模式关注行为封装与切换,支持动态替换算法,增强灵活性。两者结合形成“策略工厂”,既简化对象创建又保持低耦合。文章通过支付案例演示了模式的应用,并强调实际开发中应根据需求选择合适的设计模式,避免生搬硬套。最后推荐了JVM调优、并发编程等技术专题,助力开发者提升技能。
|
3月前
|
存储 监控 算法
企业上网监控场景下布隆过滤器的 Java 算法构建及其性能优化研究
布隆过滤器是一种高效的数据结构,广泛应用于企业上网监控系统中,用于快速判断员工访问的网址是否为违规站点。相比传统哈希表,它具有更低的内存占用和更快的查询速度,支持实时拦截、动态更新和资源压缩,有效提升系统性能并降低成本。
92 0

热门文章

最新文章