1158 字
约 3 分钟
2
策略模式解决的是:同一个事情,有很多种做法,运行时根据情况选择一种做法

策略模式解决的是:同一个事情,有很多种做法,运行时根据情况选择一种做法。

关键词:

同一个行为,不同实现。


1. 现实例子:付款方式

假设现在有一个订单系统。

用户付款:

支付订单

但是支付方式不同:

支付宝支付

微信支付

银行卡支付

一开始代码可能这样写:

public void pay(String type,double money){

    if(type.equals("alipay")){

        System.out.println("支付宝支付");

    }else if(type.equals("wechat")){

        System.out.println("微信支付");

    }else if(type.equals("bank")){

        System.out.println("银行卡支付");

    }

}

刚开始没问题。

但是后来:

增加:

Apple Pay

PayPal

数字人民币

京东支付

你的代码变成:

if(){

}else if(){

}else if(){

}else if(){

}else if(){

}

这就是问题。


2. 为什么这个问题适合策略模式?

因为这些代码虽然不同:

支付宝支付

微信支付

银行卡支付

但是它们本质都是:

支付

也就是说:

行为相同,实现不同。

所以抽象一个策略接口:

interface PayStrategy {

    void pay(double money);

}

然后每种方式一个策略:

支付宝:

class AliPayStrategy implements PayStrategy{


    public void pay(double money){

        System.out.println(
            "支付宝支付:"+money
        );

    }

}

微信:

class WechatPayStrategy implements PayStrategy{


    public void pay(double money){

        System.out.println(
            "微信支付:"+money
        );

    }

}

银行卡:

class BankPayStrategy implements PayStrategy{


    public void pay(double money){

        System.out.println(
            "银行卡支付:"+money
        );

    }

}

现在:

每个策略负责自己的逻辑。


3. 使用策略模式以后

以前:

订单系统

判断用户选择

if支付宝

执行支付宝逻辑

if微信

执行微信逻辑

现在:

订单系统

    |
    |
    ↓

PayStrategy

    |
    |
    ↓

支付宝策略

微信策略

银行卡策略

订单系统不用知道:

支付宝怎么支付。

微信怎么支付。

它只知道:

PayStrategy.pay()

4. 实际调用

比如:

用户选择微信:

PayStrategy strategy =
        new WechatPayStrategy();


strategy.pay(100);

输出:

微信支付:100

选择支付宝:

PayStrategy strategy =
        new AliPayStrategy();


strategy.pay(100);

输出:

支付宝支付:100

5. 策略模式解决的核心问题

看这句话:

如果一个类里面出现大量 if else,根据不同条件执行不同逻辑,那么这些逻辑很可能可以抽成策略。

例如:

优惠计算

普通用户

9折


VIP用户

8折


超级VIP

7折

它们都是:

计算价格

只是算法不同。

所以:

DiscountStrategy

登录方式

手机号登录

微信登录

QQ登录

Github登录

都是:

登录

只是实现不同。

所以:

LoginStrategy

文件上传

上传到:

阿里云

腾讯云

AWS

都是:

上传文件

只是实现不同。

所以:

UploadStrategy

6. 那工厂为什么经常和策略一起出现?

因为:

策略解决:

怎么执行?

工厂解决:

选择哪个策略?

举个例子:

用户:

pay("wechat")

这里的问题:

我要哪个支付方式?

工厂:

PayFactory

wechat  -> WechatPayStrategy

alipay  -> AliPayStrategy

bank    -> BankPayStrategy

返回:

PayStrategy strategy =
        PayFactory.get("wechat");

然后:

strategy.pay();

组合后:

        用户请求

           |
           ↓

      PayFactory

           |
           ↓

选择策略对象

           |
           ↓

WechatPayStrategy

           |
           ↓

执行支付逻辑

7. 你这个优惠代码为什么是策略模式?

你的场景:

身份不同

↓

优惠规则不同

↓

计算价格方式不同

所以:

UserDiscountStrategy

VipDiscountStrategy

VvipDiscountStrategy

都是策略。

但是:

选择:

"user"

对应:

UserDiscountStrategy

这个动作属于:

工厂。

所以最终:

策略模式 + 工厂模式

8. 判断口诀

看到:

多个 if else 判断执行不同算法

问:

是不是同一个事情有多个做法?

如果:

是
↓

策略模式

例如:

支付
优惠
登录
排序
压缩
序列化
负载均衡

都是策略。

一句话:

策略模式就是把一堆“不同算法/不同规则”的代码拆开,让它们可以互相替换,而业务代码只依赖统一接口。

你后面看 RPC 的时候,会大量遇到:

工厂负责拿策略,策略负责干活。 这个组合是很多中间件设计的核心。

策略模式解决的是:同一个事情,有很多种做法,运行时根据情况选择一种做法
http://clxhxhhr.top/posts/378/
作者
clxstart
发布于
2026-09-01
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。