策略模式-设计模式

1. 介绍
1.1 定义
策略模式是属于一个行为型的设计模式,定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换 & 让算法可在不影响客户端的情况下发生变化。简单来说:准备一组算法 & 将每一个算法封装起来,让外部按需调用 & 使得互换。

1.2应用场景

①:系统中有很多实现类,而他们的区别仅仅在于行为不同。

②:一个系统需要动态地在集中算法中选择一种。

2. 模式原理
2.1 UML类图 & 组成

 

3.代码

首先定义一个抽象的业务类,也就是一个方法的总类,该抽象类里面有抽象的方法,或者该类是接口也是可以的,其实也就是面向接口(抽象类)来进行的业务实现。

 1 package com.test.study.springbootstudy.test.partten.strategy1;
 2 
 3 public abstract class Payment {
 4 
 5     public abstract String getName();
 6 
 7     protected abstract Double queryBalance(String uid);
 8 
 9     public PayState<String> pay(String uid, double amout){
10         if(queryBalance(uid) < 500){
11             return new PayState(500, "支付失败", "余额不足");
12         }
13         return new PayState<>(200, "支付成功", "支付金额" + amout);
14     }
15 
16 
17 }

定义一个业务实现类1,代码如下所示:

package com.test.study.springbootstudy.test.partten.strategy1;

public class AliPay extends Payment{

    @Override
    public String getName() {
        return "支付宝";
    }

    @Override
    protected Double queryBalance(String uid) {
        return 900D;
    }

}

定义一个业务实现类2,代码如下所示:

 1 package com.test.study.springbootstudy.test.partten.strategy1;
 2 
 3 public class WechatPay extends Payment{
 4 
 5     @Override
 6     public String getName() {
 7         return "微信支付";
 8     }
 9 
10     @Override
11     protected Double queryBalance(String uid) {
12         return 200D;
13     }
14 
15 }

定义一个状态码类,代码如下所示:

package com.test.study.springbootstudy.test.partten.strategy1;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class PayState<T> {

    private int code;

    private T t;

    private String msg;

}

定义一个策略类,该类是一个重点类,其实也是可以使用工厂模式来进行实现,其实也就是把业务实现类创建成对象,然后把对象放到map里面,代码如下所示:

package com.test.study.springbootstudy.test.partten.strategy1;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class PayStrategy {

    public static final String ALI_PAY = "ALI_PAY";
    public static final String WE_CHAT_PAY = "WE_CHAT_PAY";

    private static Map<String, Payment> map = new ConcurrentHashMap<>();

    static {
        map.put(ALI_PAY, new AliPay());
        map.put(WE_CHAT_PAY, new WechatPay());
    }

    public static Payment get(String payKey){
        return map.get(payKey);
    }

}

定义一个订单类,代码如下所示:

package com.test.study.springbootstudy.test.partten.strategy1;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order {

    private String uid;
    
    private String orderId;
    
    private Double amount;

    public PayState<String> pay(){
        return pay(PayStrategy.ALI_PAY);
    }

    public PayState<String> pay(String payKey){
        Payment payment = PayStrategy.get(payKey);
        System.out.println("欢迎使用:"+payment.getName());
        System.out.println("本次交易金额为:"+ amount +", 开始扣款。。");
        return payment.pay(uid, amount);
    }

}

定义一个测试类,代码如下所示:

package com.test.study.springbootstudy.test.partten.strategy1;

public class PayStrategyTest {

    public static void main(String[] args) {
        Order order = new Order("dd12344", "df464325566", 100D);
        System.out.println(order.pay());
    }

}

4.策略模式的优缺点
策略模式的优点如下所示:
①:策略模式符合开闭原则
②:策略模式可以避免使用多重条件语句,如if...else语句、switch语句
③:使用策略模式可以提高算法的保密性和安全性
策略模式的缺点如下所示:
①:客户端必须知道所有的策略,并且自行决定使用哪一种策略
②:代码中会产生非常多的策略类,增加了代码的维护难度

 

posted @ 2021-05-03 17:53  郭慕荣  阅读(92)  评论(0编辑  收藏  举报