【Java】23种设计模式——13.策略模式

定义

策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端。

角色

  1. 环境(Context):持有一个策略类的引用,提供给客户端调用
  2. 抽象策略(Strategy):定义所有支持的算法的公共接口
  3. 具体策略(ConcreteStrategy):实现抽象策略定义的接口,提供具体算法

应用场景

  • 需要动态的在几种算法中选择一种的时候
  • 一个类定义了多种行为,且这些行为以多条件语句形式出现
  • 系统需要安全地封装不同类型的算法
  • 当算法需要自由切换时

使用

支付方法自由切换(信用卡支付和支付宝支付)

  • 抽象策略 (支付方式)

    /**
     * 抽象策略 : 支付策略
     * @Author:lyj
     * @Date:2025/5/19 17:24
     */
    public interface PaymentStrategy {
        /**
         * 支付
         * @param amount 金额
         */
        public void pay(int amount);
    }
    
  • 具体策略 (信用卡支付、支付宝支付)

    /**
     * 具体策略 : 信用卡支付
     * @Author:lyj
     * @Date:2025/5/19 17:27
     */
    public class CredCardStrategy implements PaymentStrategy {
        private  String cardNumber;     // 卡号
        public CredCardStrategy(String cardNumber) {
            this.cardNumber = cardNumber;
        }
        /**
         * 支付
         * @param amount 金额
         */
        @Override
        public void pay(int amount) {
            System.out.println("信用卡支付" + amount + "元,卡号:" + cardNumber);
        }
    }
    
    /**
     * 具体策略 : 支付宝支付
     * @Date:2025/5/19 17:28
     */
    public class AlipayStrategy implements  PaymentStrategy{
        private String account;     // 账号
        public AlipayStrategy(String account)
        {
            this.account = account;
        }
        @Override
        public void pay(int amount) {
            System.out.println("支付宝支付了" + amount + "元,账号为:" + account);
        }
    }
    
  • **环境 ** (支付选择)

    /**
     * 环境类 :·支付选择
     * @Author:lyj
     * @Date:2025/5/19 17:30
     */
    public class ShoppingCart
    {
        private PaymentStrategy paymentStrategy;        // 支付策略
    
        /**
         * 设置支付策略
         * @param paymentStrategy 支付策略
         */
        public void setPaymentStrategy(PaymentStrategy paymentStrategy)
        {
            this.paymentStrategy = paymentStrategy;
        }
    
        /**
         * 运行支付
         * @param amount 金额
         */
        public void checkOut(int amount)
        {
            paymentStrategy.pay(amount);
        }
    }
    

客户端: 运行支付测试

ShoppingCart cart = new ShoppingCart();
// 支付宝支付
cart.setPaymentStrategy(new AlipayStrategy("1234-5678-9012-2456"));
cart.checkOut(100); // 支付宝支付了100元,账号为:1234-5678-9012-2456
// 信用卡支付
cart.setPaymentStrategy(new CredCardStrategy("1234-5678-9012-3456"));
cart.checkOut(200); //信用卡支付200元,卡号:1234-5678-9012-3456
posted @ 2025-06-20 16:35  陆陆无为而治者  阅读(16)  评论(0)    收藏  举报