设计模式--策略模式

news2024/11/18 1:30:19

文章目录

  • 前言
  • 一、未使用设计模式
  • 二、策略模式
    • 1.定义
    • 2.结构
  • 三、应用场景
  • 四、优缺点
  • 参考资料


前言

需求:
一天,产品经理走过来对你说。猫啊(自称),帮我设计一个计算器,需要的功能有求最大值,最小值。应不难的吧ㄟ( ▔, ▔ )ㄏ
本文主要说明设计模式,具体算法实现不在涉及


一、未使用设计模式

小小经理,可笑可笑😏,看我一顿操作!

public class Calculation {
    public static void go(List<Integer> list, String type) throws Exception {
        if (type.equals("1")){
            // 最大值
            System.out.println("最大值");
        }else if (type.equals("2")){
            // 最小值
            System.out.println("最小值");
        }else {
            throw new Exception("error");
        }
    }

    public static void main(String[] args) throws Exception {
        List<Integer> list=new ArrayList<>();
        String type="6";
        go(list,type);
    }
}

这时,产品经理又来了,瞧我这记性,不止要实现最大最小的计算,还需要有求和,平均值,排序…😵‍💫可能以后给还会在加如更多的算法。

此时,就可以看出上述设计出现的弊端,在代码中使用了大量的if–else,如果某天经理突然又想出来一些新的需求,就不得不对Calculation的代码进行修改,此时我们就违反了设计原则中的开闭原则,同时也会造成大量的代码在一个类中,难以阅读。我们的目标应该是允许类容易扩展,在不修改现有代码的情况下就可以增加新的行为。

开闭原则 :
类应该对扩展开放,对修改关闭


二、策略模式

1.定义

该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。

2.结构

1、抽象策略角色(Strategy):通常有一个接口或一个抽象类实现

2、具体策略角色(ConcreteStrategy):包装了相关的算法和行为

3、环境角色(Context):持有一个策略类的应用,最终供客户端调用

在这里插入图片描述

我们将计算方法抽象为一个策略接口

public interface NumberGather {
    //调用集合方法的抽象方法
    public void calculation(List<Integer> list);
}

现在只需要为不同的算法建立对应的策略实现类

最小值:

public class Min implements NumberGather {
    @Override
    public void calculation(List<Integer> list) {
        List<Integer> list1 = new ArrayList<Integer>();
        Integer min = Collections.min(list1);
        System.out.println("最小值为"+min);
    }
}

最大值:

public class Max implements NumberGather{
    @Override
    public void calculation(List<Integer> list) {
        List<Integer> list1 = new ArrayList<Integer>();
        Integer max = Collections.max(list1);
        System.out.println("最大值为"+max);
    }
}

平均值:

public class Average implements NumberGather {
    @Override
    public void calculation(List<Integer> list) {
        List<Integer> list1 = new ArrayList<Integer>();
        double sum =list1.stream().mapToDouble(Integer::doubleValue).sum();
        int size = list1.size();
        double avg = sum/size;
        System.out.println("平均值为"+avg);
    }
}

环境类:

public class Context {
    private NumberGather numberGather;
    public Context(NumberGather numberGather){
        this.numberGather=numberGather;
    }
    public void go(List<Integer> list){
        numberGather.calculation(list);
    }
}

test:

public class Demo {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(8);
        list1.add(7);
        list1.add(16);
        list1.add(12);
        list1.add(3);
        Context context=new Context(new Max());
        context.go(list1);

        Context context1=new Context(new Average());
        context1.go(list1);
    }
}

三、应用场景

1、 多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2、 需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3、 对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

四、优缺点

  • 策略类之间可以自由切换。由于策略类都实现同一个接口,所以使它们之间可以自由切换。
    易于扩展。
  • 增加一个新的策略只需要添加一个具体的策略类即可,基本不需要改变原有的代码。符合开闭原则
  • 避免使用多重条件选择语句,充分体现面向对象设计思想。

  • 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这点可以考虑使用IOC容器和依赖注入的方式来解决
  • 策略模式会造成很多的策略类,可能造成类爆炸。

参考资料

百度

https://juejin.cn/post/7006126086715113480

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

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

相关文章

【JavaEE-Servlet】Filter过滤器详解

Filter过滤器熟悉的关键字-Filter&#xff08;回顾-联系-可以不看&#xff09;Filter概述何时使用&#xff1f;Filter生命周期过滤器单个实现doFilter方法关于Filter的配置路径Filter的执行顺序在web.xml文件中进行配置的时候&#xff0c;Filter的执行顺序是什么&#xff1f;使…

HTML期末学生大作业-班级校园我的校园网页设计与实现html+css+javascript

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

[附源码]Python计算机毕业设计Django停车场管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

使用 JavaScript 检测用户是否在线

有时您可能希望增强您的应用程序以通知用户他们可能已经失去了互联网连接。 用户可能正在访问您的网站并收到缓存版本&#xff0c;因此通常看起来他们的互联网仍在工作。 然而&#xff0c;他们失去了引擎盖下的连接&#xff0c;并且不会加载任何新内容。 在这里向他们显示一些…

博客系统(页面设计)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、【博客列表页】blog_list.html参考代码&#xff1a;二、【博客详情页】 blog_detail.html参考代码&#xff1a;三、【博客登录页】login.html参考代码&#xff1a;四、【博客编辑页】参考代码&#xff1a;【…

QFtp的使用

1. 环境 Win10 QT5.9.9 2. 相关说明 Qt5.0之后移除了QFtp类&#xff08;基于FTP协议实现的一个类&#xff09;&#xff0c;并且使用 QNetworkAccessManager 实现了 Ftp 的上传/下载功能。尽管后者在性能上和稳定性上有所提升&#xff0c;但有些原本 QFtp 有的功能 QNetwork…

什么是微服务?

文章目录什么是微服务微服务技术栈单体架构分布式架构认识微服务微服务技术框架SpringCloud什么是微服务 当我们提到微服务&#xff0c;很多人第一反应就是SpringCloud&#xff0c;但是微服务技术并不能与SpringCloud完全划等号&#xff1a; 微服务是分布式架构的一种&#x…

AI视频监控在畜牧养殖中的技术应用解决方案

一、方案概况 随着养殖业迅猛发展的同时也给养殖业主带来了严峻挑战。对养殖业来说&#xff0c;养殖场大多建立在偏远地区&#xff0c;给集中管理带来不便&#xff1b;畜禽养殖成本大&#xff0c;丢失、偷盗等情况时有发生&#xff0c;容易造成巨大的经济损失。建立一套远程视…

013. N 皇后

1.题目链接&#xff1a; 51. N 皇后 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 给一个数字 n &#xff0c;要求返回所有 n 个 皇后能在 n X n 的棋盘上 不相互攻击 的情况。 能攻击到的情况&#xff1a;以皇后自身为原点&#xff0c;横、竖、同斜线&#xff08;45度…

Linux搭建单机多进程zookeeper集群

01 ZooKeeper是什么 ZooKeeper 是一个开放源码的分布式协调服务&#xff0c;它是集群的管理者&#xff0c;监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终&#xff0c;将简单易用的接口和性能高效、功能稳定的系统提供给用户。 分布式应用程序可以基…

用数字隔离器取代传统的光耦合器

介绍 光耦合器是一种已有几十年历史的技术&#xff0c;广泛用于信号隔离&#xff0c;通常提供安全隔离、信号电平移位和地面回路缓解。它们通常用于广泛的终端应用中&#xff0c;包括数据通信电路、开关模式电源系统、测量和测试系统&#xff0c;以及孤立的数据采集系统。光耦…

【入门】初识深度学习

文档背景 机器学习和深度学习的概念十分火热。听上去也很难&#xff0c;不慌&#xff0c;有时候就需要行动在前脑子在后。不管&#xff0c;干就完啦。 前言 人工智能&#xff08;ArtificialIntelligence&#xff0c;AI&#xff09;是最宽泛的概念&#xff0c;是研发用于模拟、延…

数据库基本语法

SQL常用语句总结 mysql -u root -p mysql会提示你输入密码&#xff0c;输入安装配置MySQL服务时设置的密码即可。 输入如下命令生成样例数据库&#xff1a; CREATE DATABASE university; USE university; SOURCE <DLL.sql文件路径>; SOURCE <InsertStatements.sql文…

Jenkins实践指南--pipeline概述

1.pipeline概述 1.1 什么是pipeline 从某种抽象层次上讲&#xff0c;部署流水线&#xff08;Deployment pipeline&#xff09;是指从软件版本控制库到用户手中这一过程的自动化表现形式。——《持续交付-发布可靠软件的系统方法》 pipeline 英语愿意为管道&#xff0c;在Jen…

Python之路—200行Python代码搞了个打飞机游戏!!

早就知道pygame模块&#xff0c;就是没怎么深入研究过&#xff0c;恰逢这周未没约到妹子&#xff0c;只能自己在家玩自己啦&#xff0c;一时兴起&#xff0c;花了几个小时写了个打飞机程序。 很有意思&#xff0c;跟大家分享下。 先看一下项目结构 1 2 3 4 5 6 7 8 9 10 11 1…

盒子模型-css

个人学习笔记 文章目录1.什么是盒子模型&#xff1f;2.外边距3.css边框4.内边距1.什么是盒子模型&#xff1f; HTML文档中的每个元素都被描绘成矩形盒子&#xff0c;这些矩形盒子通过一个模型来描述其占用的空间&#xff0c;这个模型称为盒子模型。 盒子模型用四个边界描述&am…

打字的哪阿空扥

打字的那些事之快速移动光标 一## 、提出快速移动光标的原因 &#xff08;1&#xff09;键盘移动光标方向键不合理 情景再现&#xff1a; 当我们在打出一句话时&#xff0c;其中一个字打错&#xff0c;我们就需要去删除它&#xff0c;此时我们做的动作&#xff0c;无非有两种…

Linux知识结构体系简述

Linux 是一套免费使用和自由传播的类 Unix 操作系统&#xff0c;是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。严格来讲&#xff0c;Linux 这个词本身只表示 Linux 内核&#xff0c;但实际上人们已经习惯了用 Linux 来形容整个基于 Linux 内核&…

QFtp编译

QFtp下载&#xff1a;https://github.com/qt/qtftp 打开源码 修改头文件(不然编译会报错) 打开qftp.pro CONFIG static CONFIG - shared改成 CONFIG - static CONFIG shared也就是 - 号互换位置 4. 编译生成文件 linux下&#xff1a;*.a文件为.lib文件 windows下&#xf…

Python学习基础笔记二十六——推导式

列表推导式&#xff1a; 例1&#xff1a;30以内能被3整除的数&#xff1a; print([i for i in range(30) if i % 3 0]) 结果&#xff1a; 例2&#xff1a; 30以内能被3整除的数的平方&#xff1a; print([i**2 for i in range(30) if i % 3 0]) 结果&#xff1a; 例3&…