设计模式-策略模式 Java

模式概述

策略模式是一种行为型设计模式,它通过定义一系列可互换的算法,并将每个算法封装成独立类,使客户端能够根据需要动态切换算法

简单代码示例

java 复制代码
// 1. 抽象策略接口
interface PaymentStrategy {
    void pay(int amount);
}

// 2. 具体策略实现
class CreditCardPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("信用卡支付: " + amount + "元");
    }
}

class AlipayPayment implements PaymentStrategy {
    @Override
    public void pay(int amount) {
        System.out.println("支付宝支付: " + amount + "元");
    }
}

// 3. 环境类(持有策略引用)
class PaymentContext {
    private PaymentStrategy strategy;

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

    public void executePayment(int amount) {
        strategy.pay(amount);
    }
}

// 客户端调用
public class Client {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();
        
        // 动态切换策略
        context.setStrategy(new CreditCardPayment());
        context.executePayment(100);  // 输出:信用卡支付: 100元
        
        context.setStrategy(new AlipayPayment());
        context.executePayment(200); // 输出:支付宝支付: 200元
    }
}

技术细节

1.模式组成

组件 职责说明
抽象策略类 定义算法的公共接口,声明策略方法
具体策略类 实现抽象策略接口,提供具体算法实现
环境类 持有策略对象的引用,通过委托调用具体算法

2.优缺点

优点:

  • 符合开闭原则,新增策略无需修改已有代码
  • 避免多重条件判断(如if-else分支)
  • 算法复用,相同策略可被不同上下文使用

缺点:

  • 会产生大量小对象,增加系统复杂性
  • 多层装饰时调试困难

模式应用

事务管理(PlatformTransactionManager)

策略接口:

  • PlatformTransactionManager

具体策略:

  • DataSourceTransactionManager(JDBC事务)

  • JpaTransactionManager(JPA事务)

  • JtaTransactionManager(分布式事务)

相关推荐
xiaogai_gai4 分钟前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
打工仔折腾 AI14 分钟前
用 Dashlet 把极空间 NAS 服务入口整理成统一导航首页的实践
java·开发语言·人工智能·后端·python·rpc·ai agent 实战
小蒜学长2 小时前
微信小程序-高校自习室管理系统(代码+数据库+LW)
java·spring boot·后端·微信小程序·自习室管理
日和雫2 小时前
面向对象与面向过程,谁才是“银弹”?
设计模式
鸥梨菌Honevid2 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet
瑞克-桑切斯2 小时前
真实企业场景 运维安全与管理
java·网络·github
老板一杯拿铁2 小时前
Java 八股文面试详解:从基础到进阶的全面梳理
java·面试
const_qiu2 小时前
第 2.5 章 2.5.4-2.5.5:JWT 双 Token 与声明式权限守卫
java·人工智能
bug菌2 小时前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go
撸串-研究生2 小时前
springboot福利院管理系统73979
java·spring boot·后端·福利院管理系统