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

时间:2024-03-02 18:17:51

文章目录

  • 一、引言
  • 二、应用场景
  • 三、模式定义与实现
  • 四、优缺点分析
  • 总结

一、引言

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

二、应用场景

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

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

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

三、模式定义与实现

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

在这里插入图片描述

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

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

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

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

    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对象的引用,并提供设置和获取折扣策略的方法,以及计算订单实际价格的方法。

    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. 应用端使用:在应用程序中,可以根据会员等级动态选择并应用相应的折扣策略。

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

总结

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