Java策略模式在我司应用

这里写自定义目录标题


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

策略模式简介

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

模式结构

策略模式包含如下角色:

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


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;
    }
}

具体实现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;
    }
}

注入context

    private final Map<Integer, AddStrategy> strategyContext = new HashMap<>();

    public AddService(List<AddStrategy> strategyList) {
    
    
        for (AddStrategy strategy : strategyList) {
    
    
            strategyContext.put(strategy.getStrategyName(), strategy);
        }
    }

在业务中获取不同策略

		int = 1;//可作为变量 这样就能动态获取策略
        strategyContext.get(code).strategy(参数1);

猜你喜欢

转载自blog.csdn.net/csdn_mycsdn/article/details/128066763
今日推荐