策略模式——实践:在业务逻辑中理解设计模式

news2025/2/23 12:58:41

一般定义

策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化,也称为政策模式(Policy)。

主要角色

Context: 环境类
Strategy: 抽象策略类
ConcreteStrategy: 具体策略类
策略模式UML图

结合场景理解

一般来说,我们的controller层只做业务的编排,不进行业务逻辑的处理,也就是说不希望有很多if else这样的分支

比如,对于广告投放系统,我们的代码中有一套一般流程的投放逻辑,但是我们总会有一些大客户,他们希望定制一些个性化的投放功能。

不使用策略模式之前,对于亚马逊或者京东等需要定制化的大客户,我们可能的做法是在controller层根据厂商标识mark(比如京东为JD,亚马逊为YM)走不同的逻辑,这样其实是不好的,这会使得算法和业务耦合。

这个时候,可以考虑将if else这些逻辑从controller层抽掉,controller层只处理请求,也就是来的mark不管是什么,我们都同样处理,而不需要在controller层进行判断,把判断的逻辑隐藏在后面,这就是策略模式。

代码

/**
 * 根据不同mark进行不同逻辑(策略)来投放
 *
 */
 class StrategyTest {

    /**
     * controller层
     */
    @Test
    void strategy() {

        StrategyContext strategyContext = new StrategyContext();
        // 假设来的是京东
        AdvertiseStrategy strategy = strategyContext.getStrategy("京东");
        String s = strategy.Advertise();
        System.out.println(s);
    }


    /**
     * 策略接口
     */
    public interface AdvertiseStrategy {
        /**
         * 广告投放
         * @return
         */
        String Advertise();
    }

    /**
     * 默认策略
     */
    @Component
    class DefaultStrategy implements AdvertiseStrategy {
        @Override
        public String Advertise() {
            return "默认——广告投放完成";
        }
    }

    /**
     * 京东策略
     */
    @Component
    class JDStrategy implements AdvertiseStrategy {
        @Override
        public String Advertise() {
            return "京东——广告投放完成";
        }
    }

    /**
     * 亚马逊策略
     */
    @Component
    class YMXStrategy implements AdvertiseStrategy {
        @Override
        public String Advertise() {
            return "亚马逊——广告投放完成";
        }
    }

    /**
     * 策略上下文 、 策略选择器
     * 在这里根据不同策略进行选择
     */
    @Component
    class StrategyContext {

        private Map<String, AdvertiseStrategy> strategyMap = new HashMap<>();

        public StrategyContext() {
            strategyMap.put("京东", new JDStrategy());
            strategyMap.put("亚马逊", new YMXStrategy());
            strategyMap.put("默认", new DefaultStrategy());
        }


        // 策略选择
        public AdvertiseStrategy getStrategy(String Mark) {
            AdvertiseStrategy AdvertiseStrategy = strategyMap.get(Mark);
            if (AdvertiseStrategy != null) {
                return strategyMap.get(Mark);
            }
            // 返回默认的策略
            return new DefaultStrategy();
        }
    }
}

测试结果

京东——广告投放完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619492.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CnOpenData电商平台交易数据数据

一、数据简介 电子商务是网络化的新型经济活动&#xff0c;是推动“互联网&#xff0b;”发展的重要力量&#xff0c;是新经济的主要组成部分。通过电商平台获取的电商交易平台数据可以及时统计、监测数据&#xff0c;全方位跟踪分析电子商务市场的发展情况和发展环境&#xff…

mysql中的group by 和 having使用

mysql中的group by 和 having 使用 理论 –sql中的group by 用法解析&#xff1a; – Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。 –它的作用是通过一定的规则将一个数据集划分成若干个小的区域&#xff0c;然后针对若干个小区域进行数…

【Nginx+Tomcat的7层代理和四层代理】

目录 一、NginxTomcat负载均衡、动静分离1、正向代理2、反向代理3、Nginx动静分离实现原理Nginx静态处理优势 二、实战1.部署Nginx 负载均衡器2.部署2台Tomcat 应用服务器3.动静分离配置&#xff08;1&#xff09;Tomcat1 server 配置&#xff08;2&#xff09;Tomcat2 server …

【华为OD机试真题2023B卷 JAVAJS】评论转换输出

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 评论转换输出 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。 评论具有树状结构,除了根评论外,每个评论都有一个父评论。 当评论保…

ciso模拟器配置RIP2

本文为ciso模拟器配置RIP2 操作笔记 (供新手参考&#xff09; 思科路由器设置ip地址怎么设置(思科模拟器中怎样给路由器配置ip地址) 方法一&#xff1a; 物理配置 https://www.luyouqi.com/shezhi/39347.html 方法二&#xff1a; 路由 CLI 配置 https://blog.csdn.net/qq_6…

Tomcat ServletConfig和ServletContext接口概述

ServletConfig是一个接口&#xff0c;是Servlet规范中的一员 WEB服务器实现了ServletConfig接口&#xff0c;这里指的是Tomcat服务器 一个Servlet对象中有一个ServletConfig对象&#xff0c;Servlet和ServletConfig对象是一对一 ServletConfig对象是Tomcat服务器创建的&#xf…

你用过的低代码都装备了这四大引擎吗?

低代码开发是一种通过图形化界面和少量编码来快速构建应用程序的方法。尽管增删改查是低代码开发中常见的基本功能&#xff0c;但仅仅通过这些功能的配置&#xff0c;往往只能实现数据的输入和输出&#xff0c;无法满足实际的业务需求。 增删改查功能主要用于对数据进行操作&a…

第11章:SpringMVC注解配置

一、注解配置SpringMVC 目的是&#xff1a;使用配置类和注解代替web.xml和Spring.MVC配置文件的功能 1.创建初始化类&#xff0c;代替web.xml 在Servlet3.0环境中&#xff0c;容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类&#xff0c;如果找…

c++的概述(二)

新增bool类型 bool的变量只能赋值为true (非0) 或false (0) #include <iostream>using namespace std;int main(int argc, char const *argv[]) {bool num;num true;cout<<"true "<<true<<endl;cout<<"false "<<…

移动端布局之flex布局3:案例-携程网首页案例制作(曾经的版本)2

移动端布局之flex布局3 案例&#xff1a;携程网首页案例制作(曾经的版本)背景线性渐变index.htmlindex.css 侧导航栏index.htmlindex.css 热门活动模块制作index.htmlindex.css 案例&#xff1a;携程网首页案例制作(曾经的版本) 背景线性渐变 background:linear-gradient(起始…

简单三步,教你快速接入淘宝开放平台,调用官方API

淘宝开放平台是为了方便开发者接入淘宝平台&#xff0c;进行商品、订单等信息的管理和交互而设计的。接入淘宝开放平台需要经过一系列审核和申请流程&#xff0c;而在API权限包审核时&#xff0c;一定要提供真实有效的证件和资料&#xff0c;并满足相应的条件&#xff0c;才能顺…

Redis未授权访问漏洞复现与利用

目录 一、漏洞简介及危害 1.1什么是redis未授权访问 1.2漏洞的危害&#xff1a; 1.3漏洞影响&#xff1a; 二、漏洞复现&#xff1a; 三、未授权访问漏洞测试 3.1 利用redis写webshell 3.2 利用"公私钥"认证获取root权限 3.3 利用crontab反弹shell 四、脚本…

自动化10年+经验给你10条建议,让你在自动化界占据一片地!

目录 前言&#xff1a; 1、哪一刻&#xff0c;让你想起了自动化 1.1 执行回归测试 1.2 压测场景执行并发 1.3 UI稳定&#xff0c;接口不断升级 2、七问&#xff1a;是否了解自动化风险 2.1 团队成员的资历 2.2 自动化成本投入产出比 2.3 慎重对待UI级自动化 2.4 自动化…

OpenAI | Let’s Verify Step by Step详细解读

一、概述 title&#xff1a;Let’s Verify Step by Step 论文地址&#xff1a;https://arxiv.org/abs/2305.20050 代码&#xff1a;GitHub - openai/prm800k: 800,000 step-level correctness labels on LLM solutions to MATH problems 1.1 Motivation 近期大模型的出现极…

青岛科技大学|物联网工程|物联网定位技术(第一讲)|6.7

目录 物联网定位技术&#xff08;第一讲&#xff09; 1. 什么是物联网定位技术&#xff1f; 2. 物联网定位技术主要有哪些&#xff1f; 3. 简述卫星定位系统的发展历史以及GPS的发展概况&#xff1f; &#xff08;1&#xff09;卫星定位的由来和发展 &#xff08;2&…

【Mysql】InnoDB 中 B+ 树索引的注意事项

一、根页面万年不动 在之前的文章里&#xff0c;为了方便理解&#xff0c;都是先画存储用户记录的叶子节点&#xff0c;然后再画出存储目录项记录的内节点。 但实际上 B 树的行成过程是这样的&#xff1a; 每当为某个表创建一个 B 树索引&#xff0c;都会为这个索引创建一个根…

Vue.js 中的服务端渲染和客户端渲染的区别

Vue.js 中的服务端渲染和客户端渲染的区别 Vue.js 是一个流行的前端框架&#xff0c;它提供了一种简单而强大的方式来构建交互式用户界面。Vue.js 可以在客户端和服务端执行渲染&#xff0c;这两种方式有不同的优势和劣势。本文将介绍 Vue.js 中的服务端渲染和客户端渲染的区别…

安全测试:13款免费的安全测试工具,抓紧白嫖不看后悔

目录 1. Excercise in a Box 2. Needle 3. DevSlop 4.移动安全框架(Mobile Security Framework) 5. Frida 6. Nishang 7.Tamper 8.InSpec 9. Faraday 10. Pocsuite 11. Taipan 12.Pacu 13. Secure Guilld 总结 1. Excercise in a Box Excercise in a Box是由英国…

Vue2 前端路由

SPA 单页面应用 只有一个页面&#xff08;一个html文件&#xff09; vue-router 组件之间的切换&#xff08;hash地址与组件间的关系&#xff09;–前端路由 vue版本与路由版本的对应关系 vue2->router3 vue3->router4 入门 用vue脚手架创建只有babel组件的vue项目…

Vue.js 中的 mixin 和混入有什么区别?

Vue.js 中的 mixin 和混入有什么区别&#xff1f; 在 Vue.js 中&#xff0c;mixin 和混入是两个常用的概念&#xff0c;它们可以帮助我们实现代码的复用和组件间的通信。虽然它们的名字很相似&#xff0c;但它们的作用和用法有所不同。本文将介绍 mixin 和混入的区别&#xff…