策略模式详细介绍

简介: 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到具有共同接口的独立类中,使得它们可以互相替换。策略模式可以让算法的变化独立于使用它的客户端。

策略模式由三个核心角色组成:

  1. 环境(Context)角色:持有一个策略对象的引用,用于调用具体的算法。
  2. 抽象策略(Strategy)角色:定义了一个公共接口,所有具体策略类都要实现这个接口。
  3. 具体策略(Concrete Strategy)角色:实现了抽象策略定义的接口,提供具体的算法实现。

策略模式的优点有:

  1. 算法的变化独立于使用它的客户端,客户端可以根据需要选择不同的算法,而不需要修改代码。
  2. 策略类之间可以自由切换,增加、删除或替换策略类都不会影响客户端的代码。
  3. 策略模式提供了一种简单的扩展方式,可以通过增加新的策略类来扩展系统的功能。

策略模式的缺点有:

  1. 客户端需要了解所有的策略类,并自行选择合适的策略类,增加了客户端的复杂性。
  2. 策略模式增加了系统中的类和对象的数量,可能会导致系统更加庞大。

下面以一个商场促销的例子来说明策略模式的应用。

假设一个商场需要实现不同的促销策略,比如打折、满减等。首先,定义一个抽象的促销策略接口 PromotionStrategy,它包含一个用于计算实际价格的方法。

public interface PromotionStrategy {
    double calculatePrice(double price);
}

然后,定义具体的促销策略类,如打折策略和满减策略。

public class DiscountStrategy implements PromotionStrategy {
    private double discount;
    public DiscountStrategy(double discount) {
        this.discount = discount;
    }
    public double calculatePrice(double price) {
        return price * discount;
    }
}
public class FullReductionStrategy implements PromotionStrategy {
    private double threshold;
    private double reduction;
    public FullReductionStrategy(double threshold, double reduction) {
        this.threshold = threshold;
        this.reduction = reduction;
    }
    public double calculatePrice(double price) {
        if (price >= threshold) {
            return price - reduction;
        } else {
            return price;
        }
    }
}

接下来,定义一个商场类 ShoppingMall,它持有一个促销策略对象,并提供一个用于计算实际价格的方法。

public class ShoppingMall {
    private PromotionStrategy promotionStrategy;
    public void setPromotionStrategy(PromotionStrategy promotionStrategy) {
        this.promotionStrategy = promotionStrategy;
    }
    public double calculatePrice(double price) {
        if (promotionStrategy != null) {
            return promotionStrategy.calculatePrice(price);
        } else {
            return price;
        }
    }
}

使用策略模式的客户端代码如下:

public class Client {
    public static void main(String[] args) {
        ShoppingMall shoppingMall = new ShoppingMall();
        PromotionStrategy discountStrategy = new DiscountStrategy(0.8);
        shoppingMall.setPromotionStrategy(discountStrategy);
        double price1 = shoppingMall.calculatePrice(100);
        System.out.println("The actual price is " + price1);
        PromotionStrategy fullReductionStrategy = new FullReductionStrategy(200, 50);
        shoppingMall.setPromotionStrategy(fullReductionStrategy);
        double price2 = shoppingMall.calculatePrice(300);
        System.out.println("The actual price is " + price2);
    }
}

运行上述代码,输出结果如下:

The actual price is 80.0
The actual price is 250.0

从上述示例可以看出,策略模式通过将算法封装到具体的策略类中,使得算法的变化独立于使用它的客户端。客户端只需要选择合适的策略类,无需关心具体的算法实现。这样可以提高代码的灵活性和可维护性。

总结来说,策略模式是一种行为型设计模式,它通过将算法封装到具体的策略类中,使得算法的变化独立于使用它的客户端。策略模式适用于需要在运行时根据不同的条件选择不同的算法的情况。


目录
相关文章
|
网络协议 Java Nacos
Nacos报错问题之jar 包启动就报错误如何解决
Nacos是一个开源的、易于部署的动态服务发现、配置管理和服务管理平台,旨在帮助微服务架构下的应用进行快速配置更新和服务治理;在实际运用中,用户可能会遇到各种报错,本合集将常见的Nacos报错问题进行归纳和解答,以便使用者能够快速定位和解决这些问题。
|
人工智能 弹性计算 运维
云上创新丨云计算,如何从IT战略上升为企业核心战略?
云计算在中国发展十余年,越来越多行业开始用云,与此同时,云计算也已从企业IT战略上升为企业核心战略。未来,云计算一定是企业和开发者的首选,技术创新也一定优先诞生在云上。
云上创新丨云计算,如何从IT战略上升为企业核心战略?
|
11月前
什么是快照读和当前读
*快照读(一致性非锁定读)读取的是当前数据的可见版本,可能是会过期数据,不加锁的select就是快照读 *当前读(一致性锁定读)读取的是数据的最新版本,并且当前读返回的记录都会上锁,保证其他事务不会并发修改这条记录。如update、insert、delete、select for undate(排他锁)、select lockin share mode(共享锁) 都是当前读
|
算法
策略模式的主要优点是什么?
【7月更文挑战第2天】策略模式的主要优点是什么?
408 2
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
510 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
运维 关系型数据库 MySQL
MySQL8之mysql-community-debuginfo的作用
【7月更文挑战第10天】
215 6
|
11月前
|
人工智能 运维 Serverless
Serverless GPU:助力 AI 推理加速
近年来,AI 技术发展迅猛,企业纷纷寻求将 AI 能力转化为商业价值,然而,在部署 AI 模型推理服务时,却遭遇成本高昂、弹性不足及运维复杂等挑战。本文将探讨云原生 Serverless GPU 如何从根本上解决这些问题,以实现 AI 技术的高效落地。
966 42
|
11月前
|
存储 网络协议 算法
OSPF中的Link-State Database (LSDB): 概述与深入解析
OSPF中的Link-State Database (LSDB): 概述与深入解析
1373 1
|
机器学习/深度学习 存储 数据挖掘
深入浅出:使用Python进行数据分析
【10月更文挑战第7天】本文将带你进入Python数据分析的世界,从基础的数据结构开始,逐步深入到数据处理、数据可视化以及机器学习等高级主题。我们将通过实际案例和代码示例,让你了解如何使用Python进行有效的数据分析。无论你是初学者还是有一定经验的开发者,都能从中获得新的知识和启发。
313 2
|
11月前
|
存储 并行计算 算法
散列函数密码存储
散列函数密码存储
169 6