• Java策略模式在我司应用



    本文介绍我司如何在项目中应用策略模式,为节省时间可直接到 代码实现 章节查看

    策略模式简介

    策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化
    
    • 1

    模式结构

    策略模式包含如下角色:

    Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法(如下图的algorithm())

    Context: 环境类 /上下文类:

    上下文是依赖于接口的类(是面向策略设计的类,如下图Context类),即上下文包含用策略(接口)声明的变量(如下图的strategy成员变量)。
    上下文提供一个方法(如下图Context类中的的lookAlgorithm()方法),持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)
    ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类(如下图的ConcreteStrategyA类和ConcreteStrategyB类)。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)
    在这里插入图片描述

    应用场景

    1、 代码中存在大量 if else 逻辑判断
    2、业务代码需要根据场景不同,切换不同的实现逻辑

    代码实现

    抽象类策略

    public interface AddStrategy {
        /**
         * 策略开始之前... 可以做一些校验工作
         *
         */
        void strategyBefore();
    
        /**
         * 策略方法...执行具体业务
         *
         */
        void strategyProcess(参数1);
    
        /**
         * 策略之后....可做一些业务处理后操作
         *
         * @param id
         */
        void strategyAfter();
    
        /**
         * 执行策略
         *
         */
        void strategy(参数1){
            strategyBefore();
            strategyProcess(参数1);
            strategyAfter();};
    
        /**
         * 获取每个策略实现的标识
         * @return
         */
        Integer getStrategyName();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    具体实现1

    
    public class AddBankStrategy implements AddStrategy, CommonConstant {
    
        @Override
        public void strategyBefore() {
    
        }
    
        @Override
        public void strategyProcess(参数1) {
    		//具体实现逻辑
        }
    
        @Override
        public void strategyAfter() {
    
        }
    
        @Override
        public Integer getStrategyName() {
        	
            return 1;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    具体实现2

    public class AddGXStrategy implements AddStrategy, CommonConstant {
    
        @Override
        public void strategyBefore() {
    
        }
    
        @Override
        public void strategyProcess(参数1) {
    		//具体实现逻辑
        }
    
        @Override
        public void strategyAfter() {
    
        }
    
        @Override
        public Integer getStrategyName() {
        	
            return 2;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    注入context

        private final Map<Integer, AddStrategy> strategyContext = new HashMap<>();
    
        public AddService(List<AddStrategy> strategyList) {
            for (AddStrategy strategy : strategyList) {
                strategyContext.put(strategy.getStrategyName(), strategy);
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在业务中获取不同策略

    		int = 1;//可作为变量 这样就能动态获取策略
            strategyContext.get(code).strategy(参数1);
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    LeetCode-0607
    day4|gin的中间件和路由分组
    在线聊天系统,即时通讯系统
    编译python(cpython)的源码及其用途
    【Kafka专题】Kafka收发消息核心参数详解
    Android逆向学习(五)app进行动态调试
    手机提词器有哪些?简单介绍这一款
    后浪搞的在线版 Windows 12「GitHub 热点速览」
    Docker网络模式与数据卷
    如何在 Blender 中更快地渲染?
  • 原文地址:https://blog.csdn.net/csdn_mycsdn/article/details/128066763