策略模式:封装行为策略,灵活切换实现多态业务逻辑

文章目录

一、引言

​ 策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,并分别封装起来,让它们之间可以互相替换。这种模式使得算法的变化独立于使用算法的客户端,从而实现多态性的策略选择。

二、应用场景

策略模式适用于以下场景:

  1. 系统需要在多种算法中进行切换,每种算法解决的是同一类问题,但具体实现和表现不同。
  2. 需要在运行时根据具体情况动态地选择合适的算法来执行。

例如,在电商系统中,针对不同的会员等级可能有不同的折扣计算方式,如普通会员打折、VIP会员折上折、尊享会员满减等。策略模式可以帮助灵活地切换并应用这些不同的折扣策略。

三、模式定义与实现

策略模式的核心组成部分包括:

  1. Strategy(策略接口/抽象类):声明了一系列方法,用于定义所有支持的算法的公共接口。
  2. ConcreteStrategy(具体策略类):实现了Strategy接口,提供了具体的算法实现。
  3. Context(上下文角色):持有一个Strategy对象引用,用以调用其方法来执行相关算法,并在必要时能够更改所使用的策略。

以电商平台的折扣策略为例,来具体实现策略模式:

  1. 定义策略接口(Strategy):创建一个名为DiscountStrategy的接口,其中包含一个计算折扣的方法。

    java 复制代码
    public interface DiscountStrategy {
        double calculateDiscount(double originPrice, int memberLevel);
    }
  2. 定义具体策略类(ConcreteStrategy):为每种会员等级创建相应的折扣策略实现类,如NormalMemberDiscountVIPMemberDiscountPremiumMemberDiscount

    java 复制代码
    public class NormalMemberDiscount implements DiscountStrategy {
        @Override
        public double calculateDiscount(double originPrice, int memberLevel) {
            return originPrice * 0.9; // 普通会员9折
        }
    }
    
    public class VIPMemberDiscount implements DiscountStrategy {
        @Override
        public double calculateDiscount(double originPrice, int memberLevel) {
            return originPrice * 0.85; // VIP会员8.5折
        }
    }
    
    public class PremiumMemberDiscount implements DiscountStrategy {
        @Override
        public double calculateDiscount(double originPrice, int memberLevel) {
            if (originPrice > 500) {
                return originPrice - 200; // 尊享会员满500减200
            } else {
                return originPrice * 0.8; // 若不满500元,按8折计算
            }
        }
    }
  3. 定义上下文角色(Context):创建一个名为Order的类,其中包含一个DiscountStrategy对象的引用,并提供设置和获取折扣策略的方法,以及计算订单实际价格的方法。

    java 复制代码
    public class Order {
        private DiscountStrategy discountStrategy;
    
        public void setDiscountStrategy(DiscountStrategy strategy) {
            this.discountStrategy = strategy;
        }
    
        public double calculateFinalPrice(double originPrice, int memberLevel) {
            return discountStrategy.calculateDiscount(originPrice, memberLevel);
        }
    }
  4. 应用端使用:在应用程序中,可以根据会员等级动态选择并应用相应的折扣策略。

    java 复制代码
    public class StrategyPatternDemo {
        public static void main(String[] args) {
            Order order = new Order();
    
            int normalMemberLevel = 1;
            order.setDiscountStrategy(new NormalMemberDiscount());
            System.out.println("普通会员应付金额:" + order.calculateFinalPrice(1000, normalMemberLevel));
    
            int vipMemberLevel = 2;
            order.setDiscountStrategy(new VIPMemberDiscount());
            System.out.println("VIP会员应付金额:" + order.calculateFinalPrice(1000, vipMemberLevel));
    
            int premiumMemberLevel = 3;
            order.setDiscountStrategy(new PremiumMemberDiscount());
            System.out.println("尊享会员应付金额:" + order.calculateFinalPrice(1000, premiumMemberLevel));
        }
    }

测试结果

四、优缺点分析

优点:

  1. 提高了系统的灵活性:策略模式允许在运行时动态地改变和选择算法,增强了程序的可扩展性。
  2. 易于新增策略:只需添加新的具体策略类即可增加新的行为,对已有代码无影响。

潜在挑战:

  1. 可能导致类数量增加:每一种策略都需要创建一个新的类,当策略种类较多时,类的数量会迅速增长。
  2. 客户端必须了解各种策略之间的区别:客户端需要知道如何选择和切换策略,这可能会增加客户端的复杂性。

总结

​ 策略模式通过将一系列可互换的算法封装成单独的类,使得客户端可以在运行时动态地选择或更换算法,从而实现灵活多变的行为策略。在实际应用中,合理运用策略模式有助于简化业务逻辑,降低耦合度,提高代码的可维护性和复用性。同时应注意控制策略类的增长,避免过度设计,确保模式的应用符合实际需求。

相关推荐
腥臭腐朽的日子熠熠生辉25 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian27 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之32 分钟前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
程序猿chen1 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
松韬2 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存
绝顶少年2 小时前
Spring Boot 注解:深度解析与应用场景
java·spring boot·后端