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

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

前言

笔者是金融行业,负责出单系统开发,出单按渠道来源划分有很多种方式,业务员页面直接录单的提交审核后会提交到审核员核保,对于一些特定渠道出单的,会直接自动审核。所以这边可能会有很多种场景,针对不同的渠道来源标识需要不同的逻辑进行处理。一般在代码中会根据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
闭包的概念?优缺点?使用场景?
闭包的概念?优缺点?使用场景?
|
27天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
27天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
6月前
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
ES6 扩展运算符 ...【详解】(含使用场景、实战技巧和范例、实现原理、错误用法)
69 5
|
8月前
|
存储 Java API
掌握8条方法设计规则,设计优雅健壮的Java方法
掌握8条方法设计规则,设计优雅健壮的Java方法
|
8月前
|
设计模式 存储
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
二十三种设计模式全面解析-揭秘访问者模式:开启对象间灵活交互之门
|
设计模式 算法 Java
java实现23种设计模式-策略者模式
java实现23种设计模式-策略者模式
136 0
java实现23种设计模式-策略者模式
|
存储 算法 Java
Java集合重点知识详解——优点以及内部继承关系
Java集合重点知识详解——优点以及内部继承关系
103 0
|
设计模式 测试技术
工作中模板方法模式用法及其使用场景
工作中模板方法模式用法及其使用场景
138 0