工作中策略模式用法及其使用场景?

简介: 工作中策略模式用法及其使用场景?

前言

笔者是金融行业,负责出单系统开发,出单按渠道来源划分有很多种方式,业务员页面直接录单的提交审核后会提交到审核员核保,对于一些特定渠道出单的,会直接自动审核。所以这边可能会有很多种场景,针对不同的渠道来源标识需要不同的逻辑进行处理。一般在代码中会根据If else 写很多的判断,考虑到开闭原则,拓展性等问题,这里使用了策略设计模式来处理。

业务场景:

概述

从业务场景图中可以看到,三种出单来源会有不同的逻辑处理,但是他们都是属于同一种行为,审核逻辑处理,既然都有同个特性,我们就可以抽象出一个接口,不同渠道来源对应一个逻辑实现类。这样我们就有了三个处理类,但是这三者还没有嵌入业务流程的,我们需要一个管理类来将这两者关联起来。

测试用例

编写抽象类

public interface Audit {
    public  void execute(String data);
}

页面来源处理器

public class WebAudit implements Audit {
    @Override
    public void execute(String data) {
        System.out.println("页面录单来源:提交上级审核");
    }
}

渠道A来源处理器

public class ChannelAAudit implements Audit {
    @Override
    public void execute(String data) {
        System.out.println("渠道A来源,自动审核通过");
    }
}

渠道B来源处理器

public class ChannelBAudit implements Audit {
    @Override
    public void execute(String data) {
        System.out.println("渠道B来源,自动审核通过");
    }
}

策略处理器

public class AuditContext {
    private Audit audit;
    public AuditContext(Audit audit) {
        this.audit=audit;
    }
    public void handle(String data){
        audit.execute(data);
    }
}

测试

public class ChannelBAudit implements Audit {
    @Override
    public void execute(String data) {
        System.out.println("渠道B来源,自动审核通过");
    }
}

418edcd94a7a38e64592362bbfeb8ca9_bab932e72a8d4fc59d77a2eaa5f55469.png

这样我们就完成了策略模式的编写,但是大家应该也发现问题,就是我们需要去new对象,而且也没有根据业务来源标识来自动创建。虽然策略模式能将各个功能独立开,但是针对这次的业务场景还需要结合简单工厂模式。

结合简单工厂模式

我们改造一些策略处理器,将简单工厂模式嵌入进去。

public class AuditContext {
    private Audit audit;
    public AuditContext(String channelFlag)throws Exception {
        switch (channelFlag){
            case "W":
                audit=new WebAudit();
                break;
            case "A":
                audit=new ChannelAAudit();
                break;
            case "B":
                audit=new ChannelBAudit();
                break;
        }
        if (audit==null){
            throw new RuntimeException("找不到处理器!");
        }
    }
    public void handle(String data){
        audit.execute(data);
    }
}

测试

    public static void main(String[] args) throws Exception {
        String channelFlag="A";
        AuditContext auditContext = new AuditContext(channelFlag);
        auditContext.handle("业务数据");
    }

6684768c3d558a72778022161187ebdc_c178e8983b954d56ac21fb69a22b0514.png

总结

策略模式是一种定义一系列算法的方法,每个实现类逻辑分开,互相独立,可以降低耦合度。针对这次的需求有多种设计模式可以运用,因为业务场景不是特别多,而且这种可读性比较好,后面拓展的时候直接增加一个类型即可,具体还是得根据业务发展来调整,没办法一次性就变得完善。


优点


策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。


策略模式提供了可以替换继承关系的办法。继承可以处理多种算法或行为。如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为。但是,这样一来算法或行为的使用者就和算法或行为本身混在一起。决定使用哪一种算法或采取哪一种行为的逻辑就和算法或行为的逻辑混合在一起,从而不可能再独立演化。继承使得动态改变算法或行为变得不可能。


使用策略模式可以避免使用多重条件转移语句。多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后。


缺点


客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道所有的算法或行为的情况。


策略模式造成很多的策略类,每个具体策略类都会产生一个新类。有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同客户端使用。换言之,可以使用享元模式来减少对象的数量。


目录
相关文章
|
存储 缓存 JavaScript
闭包的概念?优缺点?使用场景?
闭包的概念?优缺点?使用场景?
|
5月前
|
安全 Java 数据库
ifPresent()`方法的用途、使用场景
ifPresent()`方法的用途、使用场景
398 4
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
4月前
|
设计模式 算法 Java
策略模式与模版模式的区别与应用
策略模式与模版模式的区别与应用
60 4
|
6月前
|
设计模式 存储 SQL
第四篇 行为型设计模式 - 灵活定义对象间交互
第四篇 行为型设计模式 - 灵活定义对象间交互
127 0
|
设计模式 算法 Java
如何用函数式接口重构常见模式
如何用函数式接口重构常见模式
168 0
|
设计模式 测试技术
工作中模板方法模式用法及其使用场景
工作中模板方法模式用法及其使用场景
118 0
|
设计模式 前端开发 Java
工作中简单工厂模式用法及其使用场景?
工作中简单工厂模式用法及其使用场景?
108 0
|
Java 测试技术 容器
工作中责任链模式用法及其使用场景?
工作中责任链模式用法及其使用场景?
129 0
|
安全 Java 测试技术
工作中单例模式用法及其使用场景?
工作中单例模式用法及其使用场景?
98 0