一、特点
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中的例子
我们对集合进行排序,里面对排序规则其实就是一个一个的策略.在这里插入代码片