什么是策略模式?

一、特点

1.最终执行结果是固定的
2.执行过程和执行逻辑不一样

怎么理解这2个特点可以通过下面的举例去理解

二、举例说明

1.如果我们去北京,我们可以通过很多方式过去
1). 坐火车
2).坐高铁
3).坐飞机
4).坐汽车

不管选择什么样的交通工具.我们去北京这个目的地是固定的(第一个特点)
我们坐不同的交通工具前往,过程是不一样的(第二个特点)

这个交通方式,我们就可以把它看做是一个一个的策略,我们选择坐了飞机,就坐不了其他的

2.我们在网上购物,最后下单的时候,会让我们选择不同的结账方式
1). 支付包
2). 微信支付
3). 银联支付

不管选择什么样的支付方式.我们最终都是去结账(第一个特点)
不同的支付方式,我们的逻辑过程是不一样的(第二个特点)

上面的支付方式,我们就可以看作是一个个的策略

三、代码实现

我们用支付方式作为例子

我们这里有个支付接口

public class PayService {


    /**
     * 为什么这里不用接口作为参数?
     *
     * 前端一般都是传支付类型的某个值
     * 我们可以将这个值,和相应的策略类,用枚举对应起来
     * 这样我们可以通过这个值找到相应策略类去执行
     *
     * 这么做我们省略很多的if else 代码
     * @param payType
     */
    public void pay(Integer payType){

       PayTypeEnum.getPayTypeEnum(payType).getPayStrategy().pay();
    }
}

我们定义一个策略的抽象类

public abstract class PayStrategy {

    public abstract void pay();
}

每一个策略都继承上面都抽象接口

public class WechaPay extends PayStrategy
{
    @Override
    public void pay() {
        System.out.println("微信支付");
    }
}

public class YinlianPay extends PayStrategy {
    @Override
    public void pay() {
        System.out.println("银联卡支付");
    }
}
public class Alipay extends PayStrategy {
    @Override
    public void pay() {
        System.out.println("支付宝支付");
    }
}

定义一个枚举:

package com.kangping.strategy;

public enum PayTypeEnum {
    ALIPAY(10,new Alipay()),
    WECHAR(20,new WechaPay()),
    YINLIAN(30,new YinlianPay())
    ;


    private Integer code;

    private PayStrategy payStrategy;

    PayTypeEnum(Integer code, PayStrategy payStrategy) {
        this.code = code;
        this.payStrategy = payStrategy;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public PayStrategy getPayStrategy() {
        return payStrategy;
    }

    public void setPayStrategy(PayStrategy payStrategy) {
        this.payStrategy = payStrategy;
    }

    public static PayTypeEnum getPayTypeEnum(Integer code){
        for (PayTypeEnum payTypeEnum : PayTypeEnum.values()) {
            if (payTypeEnum.code.equals(code) ) {
                return payTypeEnum;
            }
        }
        return null;
    }
}

测试类

public class Test {


    public static void main(String[] args) {

        new PayService().pay(PayTypeEnum.ALIPAY.getCode());
    }
}

小结:当我们需要扩展更多的支付方式,只需要继承PayStrategy这个抽象解困,维护上面枚举类,其他的业务代码,我们不需要做修改,这样就符合类开闭原则

uml 类图
在这里插入图片描述

四、java中的例子

在这里插入图片描述
我们对集合进行排序,里面对排序规则其实就是一个一个的策略.在这里插入代码片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值