zoukankan      html  css  js  c++  java
  • 策略模式设计模式

    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语句
    ③:使用策略模式可以提高算法的保密性和安全性
    策略模式的缺点如下所示:
    ①:客户端必须知道所有的策略,并且自行决定使用哪一种策略
    ②:代码中会产生非常多的策略类,增加了代码的维护难度

    郭慕荣博客园
  • 相关阅读:
    Linux网络配置之虚拟网卡的配置(Red Hat 6.5)
    Linux网络配置之虚拟网卡的配置(ubuntu 16.04)
    Red Hat 6.5 本地yum源的配置
    Red Hat 6.5 网络yum源的配置
    动手学深度学习 | 物体检测和数据集 | 40
    软件测试兼职平台
    Android共性问题
    软件测试人员应该知道的
    面试
    设计测试用例时需要考虑的思路
  • 原文地址:https://www.cnblogs.com/jelly12345/p/14727876.html
Copyright © 2011-2022 走看看