【设计模式】策略模式和责任链模式

news2024/12/24 9:23:31

策略模式

任何程序都离不开算法,我们需要通过算法去解决特定的问题
策略模式将算法的实现分别封装起来,让他们之间可以方便的进行替换,而不需要去改动代码。属于行为型模式。

举个例子:拼多多现在有促销活动,其优惠策略可能是拼团活动价格,优惠券抵扣,补贴价格,购物返现等…

如果直接写代码,那么就是在代码里写一堆if … else…,会使得代码非常复杂和臃肿,这个时候就需要策略模式了

适合场景

  • 针对同一类问题,不同场景有不同的实现
  • 算法需要根据场景进行自由切换

策略模式主要包含三种角色:
Context :用来操作算法/策略的上下文环境
Strategy抽象策略角色: 规定算法的接口
ConcreteStrategy : 具体的算法实现

public interface IPromotionStrategy {

    void deals();
}

public class GroupBuyPromotionStrategy implements IPromotionStrategy{

    @Override
    public void deals() {
        System.out.println("拼团成功,享受团购价");
    }
}

public class EmptyPromotionStrategy implements IPromotionStrategy {

    @Override
    public void deals() {
        System.out.println("原价购买");
    }
}

public class CouponPromotionStrategy implements IPromotionStrategy{

    @Override
    public void deals() {
        System.out.println("领取优惠券,参与促销");
    }
}

public class PromotionStrategyFactory {

    private static Map<PromotionType, IPromotionStrategy> map = new HashMap<>();

    private static EmptyPromotionStrategy empty = new EmptyPromotionStrategy();

    static {
        map.put(PromotionType.GROUPBUY, new GroupBuyPromotionStrategy());
        map.put(PromotionType.COUNPON, new CouponPromotionStrategy());
    }

    public IPromotionStrategy getPromotion(PromotionType type) {
        if (map.containsKey(type)) {
            return map.get(type);
        }
        return empty;
    }

    enum PromotionType {
        GROUPBUY, COUNPON;
    }

}

    public static void main(String[] args) {
        PromotionStrategyFactory factory = new PromotionStrategyFactory();
        IPromotionStrategy strategy = factory.getPromotion(PromotionStrategyFactory.PromotionType.COUNPON);
        strategy.deals();
    }

责任链模式

责任链模式就是将请求沿着处理链进行发送,每个链节点收到请求后,都可以对请求进行处理或者将其传递给链上的下一个节点。属于行为型设计模式。

我们平时的公文审批就属于经典的责任链模式

责任链模式主要包含两个角色:
抽象Handler: 定义处理接口,并维护下一个处理Handler的引用
具体处理者: 对请求进行处理;如果不处理则转发给下一个Handler

使用场景:

  • 多条件的流程判断,eg.权限控制
  • 系统审批流程

现在有一个db的操作,需要经过组长,领导,DBA的三重审批才可以执行,使用责任链代码实现如下

public abstract class Handler{

    private Handler nextHandler;
    
    //判断是否有下一个handler,有的话则继续移交给下一个handler处理
    public void handleRequest() {
        handle();
        if (this.nextHandler != null) {
            this.nextHandler.handleRequest();
        }
    }

    abstract void handle();
    
    //返回当前的handler,便于链式构建执行链
    public Handler setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
        return nextHandler;
    }

}

public class TeamLeaderHandler extends Handler{

    @Override
    void handle() {
        System.out.println("组长审批通过....");
    }
}

public class LeaderHandler extends Handler{

    @Override
    void handle() {
        System.out.println("领导审批通过....");
    }
}

public class DBAHandler extends Handler{

    @Override
    void handle() {
        System.out.println("DBA审批通过并执行....");
    }
}
public static void main(String[] args) {
        TeamLeaderHandler handler = new TeamLeaderHandler();
        handler.setNextHandler(new LeaderHandler())
                .setNextHandler(new DBAHandler());
        handler.handleRequest();
    }

执行效果 如图:
在这里插入图片描述

责任链模式的优点:

  1. 将请求与处理解耦
  2. 可以方便地改变内部传递的规则, 动态添加新的执行节点或者删除节点
  3. 易于扩展,如果想要新增一个处理节点,非常方便

实际使用责任链的时候,一个请求既可以在被任一节点处理后直接结束,也可以走完整个链路再结束,具体视使用场景决定

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

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

相关文章

2023 年 Java 面试正确姿势(1000+ 面试题附答案解析)

几年前&#xff0c;你只需要简单的 ssm 框架&#xff0c;就能轻松找到一份 Java 的工作&#xff0c;但现在不一样了&#xff0c;随着涌入这个行业的人越来越多&#xff0c;同一个岗位需要筛选掉更多人&#xff0c;要求自然水涨船高&#xff0c;这也就是现在越来越多 Java 程序员…

若依学习——BaseController类(PageHelper)

若依的许多controller都继承了BaseController类&#xff0c;学习一下里面的几个方法。1、initBinder&#xff08;&#xff09;方法查了一下&#xff0c;好像是用来解决前端出传来的属性与后端绑定的&#xff0c;不常用&#xff0c;知道个大概就行&#xff0c;详情&#xff1b;(…

基于自抗扰控制ADRC的主动悬架控制

目录 前言 1. 悬架系统 2.ADRC流程图 3.仿真分析 3.1 性能指标和观测效果对比 3.2控制输入对比 3.3 性能指标均方根对比 4.总结 前言 之前通过4篇文章介绍了ADRC&#xff0c;并且在最后一篇文章中进行了总结和应用&#xff0c;本篇文章继续将其应用于悬架对象上&am…

Mysql高级之索引结构详解

Mysql的索引详解1.索引定义2.索引结构2.1数据结构分析2.1.1熟知的数据结构2.1.2分析为什么这么多的数据结构不全适用于索引结构2.2Hash结构2.3B tree结构3.索引分类3.1聚集索引&#xff08;聚簇索引&#xff09;3.2非聚集索引&#xff08;稀疏索引&#xff09;3.3联合索引3.4主…

用于健康医疗的AI计算机视觉:使提供者能够增强患者护理

通过模仿和充当人力的力量&#xff0c;人工智能驱动的计算机视觉技术正在帮助医疗保健行业的医生、护士和企业更好地满足患者的需求。例如通过实时视频分析新见解可帮助他们节省时间、金钱和生命&#xff0c;同时为从患者入院到手术室等各个方面开发更安全、更高效的流程。用于…

java面试八股文之------Redis夺命连环25问

java面试八股文之------Redis夺命连环25问&#x1f468;‍&#x1f393;1.为什么redis这么快&#x1f468;‍&#x1f393;2.redis的应用场景&#xff0c;为什么要用&#x1f468;‍&#x1f393;3.redis6.0之前为什么一直不使用多线程&#xff0c;6.0为甚么又使用多线程了&…

Spring Cloud融合Nacos实现服务配置中心 | Spring Cloud 7

一、服务配置中心 先我们来看一下,微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个微服务架构下&#xff0c;配置文件会随着微服务的增多变的越来越多&#xff0c;而且分散在各个微服务中&#xff0c;不好统一配置和管理。 配置文件无法区分环境&a…

jQuery和ajax案例练习

jQuery和ajax案例练习1.使用jquery修改div元素的背景色(随意颜色)2.使用jquery修改div的子元素p的内容为"我是子元素"3.使用jquery修改第二个p元素的背景色为"orange"4.使用jQuery添加文本的方式将“添加的文本”追加到p标签的后方5.删除列表元素中最后一个…

理解依赖注入(DI – Dependency Injection)

文章目录依赖注入1.provide(提供)1.1 在选项式 API 中&#xff0c;可通过provide选项为后代提供数据1.2 如果想访问到组件的实例this&#xff0c;provide必须采用函数的方式&#xff08;不能用箭头函数&#xff09;&#xff0c;为保证注入方和供给方之间的响应性链接&#xff0…

K8s:开源安全平台 kubescape 实现 Pod 的安全合规检查/镜像漏洞扫描

写在前面 生产环境中的 k8s 集群安全不可忽略&#xff0c;即使是内网环境容器化的应用部署虽然本质上没有变化&#xff0c;始终是机器上的一个进程但是提高了安全问题的处理的复杂性分享一个开源的 k8s 集群安全合规检查/漏洞扫描 工具 kubescape博文内容涉及&#xff1a; kube…

工控机如何安装Python

钡铼技术BL302基于arm架构工控机&#xff0c;采用NXP的高性能处理器I.MX6ULL 运行速度高达800MHz&#xff0c;并配有8GFlash空间和512M RAM&#xff0c;硬件接口有2个网口、2个串口、1个USB口、1个SD卡卡槽、1个HDMI显示接口&#xff0c;可运行LINUX、Ubuntu、Debian等OS&#…

项目管理:如何做到项目信息透明?

项目管理中&#xff0c;管理者最担心的问题是什么&#xff1f;方项目进度不透明&#xff0c;项目的进展不明确&#xff0c;使用项目管理工具让项目进度一目了然。 1、项目管理必须目标明确。 明确的目标能够更好地指导接下来的一系列项目管理工作。 2、项目管理必须资源配置…

Redis缓存一致

背景介绍&#xff1a; redis是一个key-value存储系统。它支持存储的value类型相对更多&#xff0c;包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash&#xff08;哈希类型&#xff09;。这些数据类型都支持push/pop、add/remove及取交集并集和差…

2023 工业互联网平台:智慧制硅厂 Web SCADA 生产线

我国目前是全球最大的工业硅生产国、消费国和贸易国&#xff0c;且未来该产业的主要增量也将来源于我国。绿色低碳发展已成为全球大趋势和国际社会的共识&#xff0c;随着我国“双碳”目标的推进&#xff0c;光伏产业链快速发展&#xff0c;在光伏装机需求的带动下&#xff0c;…

干货分享!PCBA元器件间距的可焊性设计

“ SMT贴片加工逐步往高密度、细间距的设计发展&#xff0c;元器件的最小间距设计需考虑smt厂家的经验程度和工艺是否完善。元器件最小间距的设计除了保证smt焊盘间不易短接的安全间距外&#xff0c;还应考虑元器件的可维护性。 ” 元器件布局为什么要保证安全间距&#xff…

喜讯!华秋电子荣获第六届“高新杯”十大优秀企业奖

2月22日&#xff0c;由中科为集团与广东高科技产业商会联合举办的“第六届‘高新杯’十大优秀高新企业颁奖典礼暨2023年高新企业高质量发展春茗会”&#xff0c;在深圳隆重举行。 中科为集团自2014年举办首届“高新杯”以来&#xff0c;已主办了5届&#xff0c;共计600多家企业…

如何在CSDN上赚钱:CSDN收益渠道分析

文章目录说明哪些人&#xff0c;哪些资源赚到了钱&#xff1f;上传付费资源的策略一些经验说明 在CSDN平台上要想获得回报&#xff0c;主要的渠道&#xff1a; 付费资源付费专栏文章打赏 这三个都有门槛&#xff0c;上传付费资源需要原力等级达到Lv5&#xff0c;粉丝数500&a…

微信怎么发文字朋友圈?简单快捷的方法,只需1分钟

微信是一个非常受欢迎的聊天工具&#xff0c;也是一个交友&#xff0c;分享生活的平台。其中&#xff0c;朋友圈是最受欢迎的功能之一&#xff0c;让我们可以与好友分享自己的生活点滴&#xff0c;也能够关注他人的动态。那么微信怎么发文字朋友圈呢&#xff1f;下面跟着小编一…

tensorflow lite简介-移动设备端机器学习

TensorFlow Lite 是一组工具&#xff0c;可帮助开发者在移动设备、嵌入式设备和 loT 设备上运行模型&#xff0c;以便实现设备端机器学习。 支持多平台 支持多种平台&#xff0c;涵盖 Android 和 iOS 设备、嵌入式 Linux 和微控制器。 原理/流程 工作原理或者使用流程就是上面…

物联网WEB大屏数据可视化

最近了解WEB大屏显示。一般像嵌入式这类的&#xff0c;MQTT协议会走的多一些&#xff0c;走订阅和发布的策略&#xff0c;网上走了一圈之后&#xff0c;目前有几个实现方案。这里对比一下几个物联网协议&#xff0c;相对而言MQTT更合适物联网&#xff0c;其它几个协议不是干这个…