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

文章目录

一、引言

​ 策略模式(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. 客户端必须了解各种策略之间的区别:客户端需要知道如何选择和切换策略,这可能会增加客户端的复杂性。

总结

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

相关推荐
qmx_0723 分钟前
HTB-Jerry(tomcat war文件、msfvenom)
java·web安全·网络安全·tomcat
为风而战31 分钟前
IIS+Ngnix+Tomcat 部署网站 用IIS实现反向代理
java·tomcat
技术无疆2 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
架构文摘JGWZ5 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师6 小时前
spring获取当前request
java·后端·spring
aPurpleBerry6 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏6 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko7 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985947 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
IT学长编程7 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统