漫画演绎策略设计模式

news2025/1/12 12:05:53
引言

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

普通设计

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

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

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.coloradmin.cn/o/1373123.html

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

相关文章

【前端】使用javascript开发一个在线RGB颜色转换

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是是《前端》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌…

海量数据处理数据结构之Hash与布隆过滤器

前言 随着网络和大数据时代的到来,我们如何从海量的数据中找到我们需要的数据就成为计算机技术中不可获取的一门技术,特别是近年来抖音,快手等热门短视频的兴起,我们如何设计算法来从大量的视频中获取当前最热门的视频信息呢&…

P1328 [NOIP2014 提高组] 生活大爆炸版石头剪刀布————C++

目录 [NOIP2014 提高组] 生活大爆炸版石头剪刀布题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code调用函数的Code(看起来简洁一点)运行结果 [NOIP2014 提高组] 生活大爆炸版石头剪刀布 …

12.22 探探 数分 已HR面

岗位信息 1222 3.30PM 1面 40min 能感觉数据基建还不是很完善 因此 问了一些指标体系的问题还挺多 自我介绍能力考察1.说说你是怎么异常归因的以付费场景项目为例2.归因中如果遇到一个页面同时存在有3个实验在跑 无法归因出数据的异常是哪个改动造成的怎么办?3.讲…

服务器配置SSL证书到nginx基于Fdfs存储服务器或者直接阿里云绑定SSL

1.如果用FDFS存储服务器内置nginx设置SSL证书 1.验证当前nginx是否存在 http_ssl_modulehttp_ssl_module模块 如果存在直接配置就行 server {listen 80 default backlog2048;listen 443 ssl; server_name 域名; ssl_certificate /usr/local/nginx_fdfs/ssl/xxxx.top.crt; ssl…

Linux---gcc编译

目录 前言 一、gcc编译 二、程序的编译过程 三、gcc查看编译过程 1.预处理阶段 2.编译 3.汇编 4.链接 动静态库链接的内容 动静态库链接的优缺点 5.总结记忆 前言 在前面我们学会使用vim对文件进行编辑,如果是C或者C程序,我们编辑好了内容…

嵌入式-Stm32-江科大基于寄存器点亮LED灯

文章目录 前言:一:搭建基于寄存器控制LED的工程二:用江科大的STM32板子实现基于寄存器点亮LED灯三:用非江科大stm32板子实现基于寄存器点亮LED灯道友:一星陨落,黯淡不了星空灿烂;一花凋零&#…

脚本编程游戏引擎会遇到哪些问题

在游戏开发中,脚本编程已经成为了一种非常常见的方式,用来实现游戏逻辑和功能。但是脚本编程游戏引擎也可能会面临一些挑战和问题。下面简单的探讨一下都会遇到哪些问题,并且该如果做。 性能问题 脚本语言通常需要运行时解释执行&#xff0…

3.4 在开发中使用设计模式

现在,我们应该对设计模式的本质以及它们的组织方式有了初步的认识,并且能够理解ROPES过程在整体设计中的作用。通过之前章节对“体系结构”及其五个视图的探讨,我们打下了坚实的基础。初步了解了UML的基本构建模块后,我们现在可以…

计算机二级WPS Office考试须知、如何备考、备考建议

本文从计算机二级考试须知、如何备考、备考建议以及考试的注意事项等方面进行讲述,认认真真看,对你受益匪浅。 一、计算机二级考试须知 2021年3月27日至29日将举办第60次全国计算机等级考试(NCRE),从今年起&#xff0…

python json模块

json是JavaScript对象表示法的缩写,是一种轻量级的数据交换格式,经常被用于Web应用程序中。python中的json库是用于解析和生成json数据格式的库。 import jsondata {"name": "张三","age": 18,"hobbies": [&q…

Gitlab-ci:从零开始的前端自动化部署

一.概念介绍 1.1 gitlab-ci && 自动化部署工具的运行机制 以gitlab-ci为例: (1) 通过在项目根目录下配置.gitlab-ci.yml文件,可以控制ci流程的不同阶段,例如install/检查/编译/部署服务器。gitlab平台会扫描.gitlab-ci.yml文件&…

遥感单通道图像保存为彩色图像

系列文章目录 第一章PIL单通道图像处理 文章目录 系列文章目录前言一、代码实现二、问题记录在这里插入图片描述 总结 前言 将单通道图像以彩色图像的形式进行保存主要使用了PIL库 一、代码实现 palette_data [***]:可以进行自定义设置 代码如下: fr…

字体图标操作步骤

网站 直接点击 进去后长这样,点免费的添加 保存下载 保存后解压 把fonts文件夹复制粘贴到我们自己项目 可以放在同images的路径下 引入 来源于 再style中粘贴 font-face {font-family: icomoon;src: url(fonts/icomoon.eot?jyg4cp);src: url(fonts/icomoo…

UVa12304 2D Geometry 110 in 1!

题目链接 UVa12304 2D Geometry 110 in 1! 题意 这是一个拥有6(二进制是110)个子问题的2D几何问题集。 1 CircumscribedCircle x1 y1 x2 y2 x3 y3:求三角形(x1,y1)-(x2,y2)-(x3,y3)的外接圆。这3点保证不共线。答案应格式化成(x,y,r…

C++从零基础到入门(1)

目录 一、输入输出 (iostream库) 1.标准输出流cout 2.标准输入流cin 3.标准库iostream (1)iostream中的窄字符(char) (2)iostream中的 宽字符(wchar_t) 二、变量与数据类型 …

Map与JSONObject区别

相同点: 都可以存key-value;key是唯一的,如果key重复了会覆盖前面的 不同点: (1)JSONObject 不可以存空,Map可以存空。 (2)Map由jdk提供,JsonObject需要第三方jar包提供。…

搜索与图论第一期 DFS(深度优先搜索)

前言 DFS这部分难度不大,大家应该完全掌握!!! 一、DFS的基本内容 内容: 深度优先遍历图的方法是,从图中某顶点v出发: (1)访问顶点v; (2&#…

使用Linux防火墙管理HTTP流量

在Linux系统中,防火墙是用于控制网络流量的重要工具。通过防火墙,你可以根据需要限制、过滤或允许特定的网络流量,从而提高系统的安全性。在处理HTTP流量时,防火墙可以帮助你实施访问控制、流量监控和其他安全策略。 iptables i…

【NVIDIA】Jetson Orin Nano系列:烧写Ubuntu22.04

1、简介 最新的sdk-manager已经可以安装到Ubuntu22.0,也支持在 Jetson Orin Nano 上烧写Ubuntu22.04。 官网介绍:https://developer.nvidia.com/sdk-manager 2、版本介绍 JetPack版本:https://developer.nvidia.com/embedded/jetpack-ar…