当前位置: 首页 > news >正文

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

文章目录

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

一、引言

​ 策略模式(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 {@Overridepublic double calculateDiscount(double originPrice, int memberLevel) {return originPrice * 0.9; // 普通会员9折}
    }public class VIPMemberDiscount implements DiscountStrategy {@Overridepublic double calculateDiscount(double originPrice, int memberLevel) {return originPrice * 0.85; // VIP会员8.5折}
    }public class PremiumMemberDiscount implements DiscountStrategy {@Overridepublic 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. 客户端必须了解各种策略之间的区别:客户端需要知道如何选择和切换策略,这可能会增加客户端的复杂性。

总结

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

相关文章:

  • uniapp的扩展组件uni-popup 弹出层自动打开
  • python学习笔记-内置异常
  • CMS垃圾回收器
  • Kotlin:协程基础
  • Leetcoder Day25| 回溯part05:子集+排列
  • 大概了解一下G1收集器
  • Redis 学习笔记 3:黑马点评
  • 服务器部署java 的docker项目,以及常用的一些命令
  • 可视化图文报表
  • Python爬虫进阶:爬取在线电视剧信息与高级检索
  • 【论文阅读】基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪
  • iOS高级理论:分类和扩展
  • 多微服务合并为一个服务
  • 如何在debian上实现一键恢复操作系统?
  • 在IDEA中创建vue hello-world项目
  • 分享一款快速APP功能测试工具
  • 07.Android之多媒体问题
  • Android组件 - 收藏集 - 掘金
  • canvas 绘制双线技巧
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Js基础知识(一) - 变量
  • PermissionScope Swift4 兼容问题
  • Protobuf3语言指南
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue自定义指令实现v-tap插件
  • yii2中session跨域名的问题
  • 数组的操作
  • 一道面试题引发的“血案”
  • 正则表达式
  • 中文输入法与React文本输入框的问题与解决方案
  • Python 之网络式编程
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (¥1011)-(一千零一拾一元整)输出
  • (arch)linux 转换文件编码格式
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)字符分类函数
  • (M)unity2D敌人的创建、人物属性设置,遇敌掉血
  • (Note)C++中的继承方式
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)计算机毕业设计高校学生选课系统
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • ******之网络***——物理***
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 材料检测系统崩溃分析
  • .NET 事件模型教程(二)
  • .NET 中 GetProcess 相关方法的性能
  • .net(C#)中String.Format如何使用
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .net解析传过来的xml_DOM4J解析XML文件
  • .NET性能优化(文摘)