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

文章目录

一、引言

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

总结

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

相关推荐
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫3 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java
李小白663 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp3 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶4 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb