漫画演绎策略设计模式

引言

本篇主要通过一小篇漫画的形式给大家讲讲策略模式,由于策略模式本身不是很难,这里就不花太多的言辞描述了,一起看漫画吧

普通设计

从前有一个妈妈,她有一个叛逆的儿子,妈妈每天除了上下班就是要教育儿子,上下班的内容是固定的,现在每天唯一负责并且可能会变的就是教育儿子的方式,那么我们应该如何设计呢
在这里插入图片描述

对应的流程图如上,这种设计的代码实现如下

public class Main {
    public static void main(String[] args) {
        People mother = new People("妈妈", 31);
        People son = new People("冤种儿子", 12);

        System.out.println(mother.name+"上班....");
        System.out.println(mother.name+"下班....");
        System.out.println(mother.name+"准备教育");
        System.out.println("弯腰拿拖鞋");
        System.out.println("拿拖鞋抽"+son.name);
        System.out.println("把拖鞋放回脚下");
        System.out.println(mother.name+"教育结束");
    }
}

输出如下

妈妈上班....
妈妈下班....
妈妈准备教育
弯腰拿拖鞋
拿拖鞋抽冤种儿子
把拖鞋放回脚下
妈妈教育结束

如果教育方式变成衣架要怎么改呢?
在这里插入图片描述

如上图可以看到就是将教育的流程改变下,对应的代码如下

public class Main {
    public static void main(String[] args) {
        People mother = new People("妈妈", 31);
        People son = new People("冤种儿子", 12);

        System.out.println(mother.name+"上班....");
        System.out.println(mother.name+"下班....");
        System.out.println(mother.name+"准备教育");
        System.out.println("去走廊拿衣架");
        System.out.println("拿衣架抽"+son.name);
        System.out.println("回走廊放衣架");
        System.out.println(mother.name+"教育结束");
    }
}

输出如下

妈妈上班....
妈妈下班....
妈妈准备教育
去走廊拿衣架
拿衣架抽冤种儿子
回走廊放衣架
妈妈教育结束

这样改我们发现有两个问题

  1. 如果很多家庭都是这么教育(很多地方都是这么写),当涉及到教育方式变动时,改动就会很多
  2. 如果教育逻辑更加复杂的话,教育的逻辑容易跟“妈妈”的一天的内容耦合在一起,容易互相影响
策略模式设计

那应该怎么设计呢? “计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”,此问题也不例外。通过抽象出一层策略层来解耦“妈妈”和教育方式,“妈妈”和教育方式的细节都依赖于策略层,“妈妈“只需要告诉策略层自己要选择哪一种教育方式即可,具体内部复杂的逻辑不需要”妈妈关心“,从而达到了”职责分离“的效果,很好的解决了上面描述的两个问题,具体实现如下
在这里插入图片描述

public interface Strategy {
    void execute(People people);
}

class SlipperStrategy implements Strategy {

    @Override
    public void execute(People people) {
        System.out.println("弯腰拿拖鞋");
        System.out.println("拿拖鞋抽"+people.name);
        System.out.println("把拖鞋放回脚下");
    }
}

class HangerStrategy implements Strategy {

    @Override
    public void execute(People people) {
        System.out.println("去走廊拿衣架");
        System.out.println("拿衣架抽"+people.name);
        System.out.println("回走廊放衣架");
    }
}

class StickStrategy implements Strategy {

    @Override
    public void execute(People people) {
        System.out.println("去卧室拿棒球棍");
        System.out.println("拿棒球棍殴打"+people.name);
        System.out.println("把棒球棍放回卧室");
    }
}

接下来再看看使用方式

public class Main {
    public static void main(String[] args) {
        People mother = new People("妈妈", 31);
        People son = new People("冤种儿子", 12);

        System.out.println(mother.name+"上班....");
        System.out.println(mother.name+"下班....");
        mother.hit(new SlipperStrategy(), son);
    }
}

class People {
    String name;
    int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void hit(Strategy strategy, People people) {
        System.out.println(this.name+"准备教育");
        strategy.execute(people);
        System.out.println(this.name+"教育结束");
    }
}

输出如下

妈妈上班....
妈妈下班....
妈妈准备教育
弯腰拿拖鞋
拿拖鞋抽冤种儿子
把拖鞋放回脚下
妈妈教育结束

如果想换一个教育方式只需改动传入hit方法的策略,即可例如

mother.hit(new StickStrategy(), son);    

输出如下

妈妈上班....
妈妈下班....
妈妈准备教育
去卧室拿棒球棍
拿棒球棍殴打冤种儿子
把棒球棍放回卧室
妈妈教育结束

可以看到改动很小,即便后续有新的教育方式,只需增加新的策略类并改动这一行代码即可。这里的好处有

  1. 单一职责原则,教育方式是独立的逻辑,不该跟其他的逻辑耦合在一起,应该单独抽出来
  2. 开闭原则,面向修改关闭,面向拓展开放。在有新策略时可以新加一个策略类而不是修改之前的策略,避免影响到其他地方

基于上诉逻辑可能有人要问了,为什么不能将这些策略抽成方法呢,使用时再调用不也是一样吗?
答:接口相比方法来说跟规范以及有更多的限制,接口的边界是已经明确的设定好了,不允许做过多的改变从而限制程序不容易变得混乱

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

XTuner 大模型单卡低成本微调原理

文章目录 Finetune简介增量预训练微调指令跟随微调微调原理 XTuner微调框架XTuner数据引擎XTuner微调的优化策略 动手实战 Finetune简介 微调模式: 增量预训练微调 使用场景:让基座模型学习到一些新知识,如某个垂直领域的常识训练数据&…

微信小程序swiper实现层叠轮播图

在微信小程序中,需要实现展示5个,横向层叠的轮播图效果,轮播图由中间到2侧的依次缩小.如下图 使用原生小程序进行开发,没有使用Skyline模式,所以layout-type配置项也无效。所以基于swiper组件进行调整。 主要思路就是设置不同的样式&#xff…

勒索软件组织“黑猫”攻击英国国防公司 Ultra 的美国子公司得手

英国国防公司 Ultra 的美国子公司 Ultra Intelligence & Communications (Ultra I&C) 遭到 ALPHV (BlackCat) 勒索软件组织的攻击。 暗网上出现的信息显示,ALPHV 黑客在他们的博客上发布了 Ultra I&C 数据。据他们称,在 2023 年 12 月 27 日…

热点报告 | “尔滨”火出东北,本期热点带你盘活冬季营销

您是否曾有以下困惑?打开小红书首页推荐,似乎已经被算法教育成了成熟的信息茧房,想要找到下一个热点,又忧虑一叶以障目;看着搜索框热词,又担心无法掌握热词背后的话题命脉,难以在浮光掠影中寻找…

FastAPI + NGINX + Gunicorn 部署域名接口

简介: 今天接到一个活,给了我一台云服务器、域名,然后用FastAPINGINX来部署接口,接口的url是由域名组成的。话不多说直接看效果: 1.安装相关工具 1.1、 安装python: 如果已经安装python就跳过咯 sudo apt update sudo apt inst…

使用 Asp.net core webapi 集成配置系统,提高程序的灵活和可维护性

前言:什么是集成配置系统? 集成配置系统的主要目的是将应用程序的配置信息与代码分离,使得配置信息可以在不需要修改代码的情况下进行更改。这样可以提高应用程序的灵活性和可维护性。 ASP.NET Core 提供了一种灵活的配置系统,可…

C++-windows-linux-linuxdeployqt打包QT应用程序

1.windows下的qt5.14 1.1发布:发布这个选项的,也就是左下角改debug为release,设置后,点击编译build会在release中发现exe文件,直接执行exe会报错;缺失各种库。 QT命令行 要用Qt的命令行终端执行发布命令 …

零基础小白如何自学sql?

学习SQL对于数据分析和处理来说非常重要。SQL是一种强大的工具,可以帮助你与数据库沟通,提取,整理和理解数据。 以下是一些学习SQL的建议: 01 前期:SQL数据库学习 了解SQL的基本概念:首先,你…

亚信安慧AntDB超融合数据库:拓展亿级用户系统的智能化新纪元

在面对亿级用户规模的系统建设需求时,传统数据库往往面临诸多挑战。为了满足多样化的技术要求,项目通常需要倚赖多套技术体系,例如,一套关系型数据库用于元数据管理和标签化管理,另一套则专注于非结构化文件的处理。这…

Spark原理——总体介绍

总体介绍 编写小案例 (wordcount) Test def wordCount(): Unit {// 1. 创建 sc 对象val conf new SparkConf().setMaster("local[6]").setAppName("wordCount_source")val sc new SparkContext(conf)// 2. 创建数据集val textRDD…

【2023 - 探索】博0到博1,游戏新地图的探索日志

【2023 - 探索】博0到博1,游戏新地图的探索日志 写在最前面CSDN探索日志2023的探险 探索日志年终回顾探索 冒险回顾实习6月开始跟着老师做科研年中的一些其他事情9月开始上课开学后11月,读者互动 新年展望新年祝福 写在最前面 2023,我解锁了新…

C++ 之LeetCode刷题记录(八)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅,多学多练,尽力而为。 先易后难,先刷简单的。 35. 搜索插入位置 给定一个排序数组和一个目标值,…

Github

文章目录 Github 的作用基本概念创建仓库以及相关介绍创建文件、查看文件信息、编辑程序上传文件搜索文件下载/检出文件 Github 的作用 项目代码托管平台 基本概念 Repository 仓库,用于存放项目代码 *Star 收藏项目,方便下次查看(有一百个st…

SpringBoot内嵌Tomcat启动流程

前言 Spring MVC 让开发者不用了解 Servlet 细节,专注于 Controller 编写 API 接口。Spring Boot 更是采用约定大于配置的设计思想,通过内嵌 Tomcat 的方式让开发者可以快速构建并部署一个 Web 应用。怎么做到的呢? Tomcat启动方式 早期的…

Java 数据结构篇-实现 AVL 树的核心方法

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 AVL 树的说明 2.0 AVL 树的成员变量及其构造方法 3.0 实现 AVL 树的核心方法 3.1 获取当前节点的高度 height(AVLNode node) 3.2 更新当前节点的高度 updateHeig…

软件安全测评需要关注哪些?湖南CMA、CNAS软件测试公司推荐

在当今信息化的社会,软件安全问题日益凸显,给个人和企业的数据安全造成了极大的威胁。为了保障软件的安全性,软件安全测评应运而生。 软件安全测评是通过对软件系统的评估,发现其中存在的安全漏洞和风险,为软件的开发…

大模型 RAG 问答技术架构及核心模块盘点:从 Embedding、prompt-embedding 到 Reranker

对于RAG而言,2023年已经出现了很多工作,草台班子有了一堆,架构也初步走通,2024年应该会围绕搜索增强做更多的优化工作。 因此我们今天来系统回顾下RAG中的模块,包括一些架构,文本嵌入embedding等&#xff…

MATLAB根据数据拟合曲线

MATLAB根据数据拟合曲线 MATLAB根据数据拟合曲线视频观看 MATLAB根据数据拟合曲线 x1[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,6…

深入浅出Android dmabuf_dump工具

dmabuf是什么? 可以参考我之前写的一篇文章,在这篇文章中有介绍dma_buf:BufferManager_驱动的buffermanager-CSDN博客 dmabuf_dump工具介绍(基于Android 14) dmabuf_dump是一个可执行文件,接收参数调用libdmabufinfo.a的接口完成…

C#,入门教程(15)——类(class)的基础知识

上一篇: C#,入门教程(14)——字符串与其他数据类型的转换https://blog.csdn.net/beijinghorn/article/details/124004562 物以类聚,凡物必类。 类的使用,须遵循几个简单的原则: (1)能类则类&a…