0

0

策略模式怎样使用 运行时算法替换技巧

P粉602998670

P粉602998670

发布时间:2025-08-14 18:10:02

|

783人浏览过

|

来源于php中文网

原创

策略模式通过将算法封装为独立类并实现统一接口,使算法可在运行时动态替换,从而避免冗长的条件判断,提升代码可维护性和扩展性;1. 定义统一策略接口如discountstrategy;2. 实现多个具体策略类如regulardiscount、vipdiscount、corporatediscount;3. 创建上下文类pricingcontext持有策略引用并支持运行时通过setstrategy切换;4. 在客户端根据需要动态设置策略并调用算法,实现灵活的行为变更,适用于折扣计算、支付方式、数据导出等场景,结合工厂模式可进一步简化策略创建,增强系统的可测试性与可扩展性。

策略模式怎样使用 运行时算法替换技巧

策略模式是一种行为设计模式,它让你能在运行时动态地改变对象的行为或算法。它的核心思想是将算法封装在独立的类中,使它们可以互相替换,且与使用算法的客户端解耦。

为什么需要运行时算法替换?

在实际开发中,我们经常会遇到需要根据不同条件选择不同处理逻辑的情况。比如:

  • 计算折扣:普通用户、VIP、企业客户使用不同的折扣算法。
  • 支付方式:微信支付宝、银行卡等支付逻辑不同。
  • 数据导出格式:CSV、Excel、JSON 导出方式各异。

如果用 if-else 或 switch 判断实现,会导致代码臃肿、难以维护。策略模式正好解决这个问题。


如何使用策略模式实现运行时算法替换?

1. 定义统一的策略接口

先定义一个公共接口或抽象类,表示所有可互换的算法。

public interface DiscountStrategy {
    double calculate(double originalPrice);
}

2. 实现具体策略类

每个具体算法实现该接口。

易语言学习手册 十天学会易语言图解教程  pdf版
易语言学习手册 十天学会易语言图解教程 pdf版

十天学会易语言图解教程用图解的方式对易语言的使用方法和操作技巧作了生动、系统的讲解。需要的朋友们可以下载看看吧!全书分十章,分十天讲完。 第一章是介绍易语言的安装,以及运行后的界面。同时介绍一个非常简单的小程序,以帮助用户入门学习。最后介绍编程的输入方法,以及一些初学者会遇到的常见问题。第二章将接触一些具体的问题,如怎样编写一个1+2等于几的程序,并了解变量的概念,变量的有效范围,数据类型等知识。其后,您将跟着本书,编写一个自己的MP3播放器,认识窗口、按钮、编辑框三个常用组件。以认识命令及事件子程序。第

下载
public class RegularDiscount implements DiscountStrategy {
    public double calculate(double originalPrice) {
        return originalPrice * 0.95; // 95折
    }
}

public class VipDiscount implements DiscountStrategy {
    public double calculate(double originalPrice) {
        return originalPrice * 0.8; // 8折
    }
}

public class CorporateDiscount implements DiscountStrategy {
    public double calculate(double originalPrice) {
        return originalPrice * 0.7; // 7折
    }
}

3. 创建上下文类,支持运行时切换策略

上下文类持有一个策略引用,可以在运行时设置或更换。

public class PricingContext {
    private DiscountStrategy strategy;

    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }

    public double applyDiscount(double price) {
        if (strategy == null) {
            throw new IllegalStateException("未设置折扣策略");
        }
        return strategy.calculate(price);
    }
}

4. 运行时动态选择和替换算法

public class Client {
    public static void main(String[] args) {
        PricingContext context = new PricingContext();

        // 普通用户
        context.setStrategy(new RegularDiscount());
        System.out.println("普通用户价格: " + context.applyDiscount(100));

        // VIP用户,切换策略
        context.setStrategy(new VipDiscount());
        System.out.println("VIP用户价格: " + context.applyDiscount(100));

        // 企业用户,再次替换
        context.setStrategy(new CorporateDiscount());
        System.out.println("企业用户价格: " + context.applyDiscount(100));
    }
}

输出:

普通用户价格: 95.0
VIP用户价格: 80.0
企业用户价格: 70.0

关键技巧:运行时灵活替换

  • 策略可插拔:只要实现
    DiscountStrategy
    接口,任何新算法都能无缝接入。
  • 避免条件判断:不需要 if-else 判断用户类型,只需注入对应策略。
  • 支持动态切换:同一个对象可以在不同时间使用不同策略。
  • 便于测试:每个策略独立,可单独测试。
  • 结合配置或用户输入:比如从数据库读取用户类型,自动选择对应策略。

常见优化方式:

  • 使用工厂模式 + 策略模式,根据类型自动创建策略:
public class DiscountFactory {
    public static DiscountStrategy getStrategy(String userType) {
        return switch (userType.toLowerCase()) {
            case "vip" -> new VipDiscount();
            case "corporate" -> new CorporateDiscount();
            default -> new RegularDiscount();
        };
    }
}

调用时更简洁:

context.setStrategy(DiscountFactory.getStrategy("vip"));

实际应用场景

  • 电商系统中的促销策略
  • 路径规划应用中的导航算法(最快、最短、避开高速)
  • 日志存储策略(本地、远程、数据库)
  • 排序或搜索算法切换(冒泡、快速、二分等)

基本上就这些。策略模式的关键在于“把变化的算法独立出来”,通过组合而非继承来实现灵活性。运行时替换只要调用

setStrategy()
就能完成,不复杂但容易忽略其威力。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

403

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

529

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

308

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

74

2025.09.10

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

713

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

520

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

404

2024.03.13

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

995

2023.10.19

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号