作为优秀的程序员你确定不了解一下“策略模式”

工厂模式和策略模式的区别 策略模式(Strategy Pattern): 策略模式是一种行为型设计模式,它定义了一系列的算法或策略,并使得这些算法可以相互替换,而不影响客户端的使用。工厂模式(Factory Pattern): 工厂模式是一种创建型设计模式,它提供了一种统一的接口来创建对象,而不需要直接使用具体的类进行实例化。以上示例中,工厂模式通过工厂类统一创建具体的图形对象,而策略模式通过设置不同的绘制策略实现不同的图形绘制方式。具体策略(Concrete Strategy):实现了策略接口,定义了具体的算法或策略。 阅读详情

时光荏苒,岁月如梭,不知不觉2020就这么过去了。新的一年,预祝大家心想事成、身体健康。

基本介绍

策略模式是行为型设计模式的一种。

策略模式的核心思想是:定义算法族(可以理解为多组算法、行为),将其分别封装起来,并且确保他们之间可以相互替换。这样做可以将算法的变化独立于使用算法的用户。

可能通过这些专业的术语还是不太好理解什么是策略模式。那么我打个比方:中午了要去吃饭了,我们可以选择米饭、面条、水饺、炒饼等等……这其中的每一个食物我们都可以将其看作是一个策略。

策略模式中体现出了三个设计原则:

1、将变化的代码从不变的代码中分离出来。
2、面向接口编程。
3、尽可能的少使用继承,可以使用组合和聚合替代。

策略模式UML类图

在这里插入图片描述

类图讲解

Strategy:策略接口,抽象出了相关方法。
ConcreteStrategyA/B:具体策略类,实现了策略接口。
Context:环境对象,类中聚合了策略接口。
Client:客户端测试类。

案例讲解

案例:通过策略模式实现运动员通过不同方式进行游泳。

游泳行为接口 => 策略接口

public interface SwimBehavior {

  // 游泳
  void swim();
}

具体游泳行为

/**
 * 仰泳
 */
public class Backstroke implements SwimBehavior {

  @Override
  public void swim() {
    System.out.println("正在进行仰泳!");
  }
}

/**
 * 蛙泳
 */
public class Breaststroke implements SwimBehavior {

  @Override
  public void swim() {
    System.out.println("正在进行蛙泳!");
  }
}

/**
 * 潜泳
 */
public class Diving implements SwimBehavior {

  @Override
  public void swim() {
    System.out.println("正在进行潜泳!");
  }
}

游泳运动员 => 对应Context角色

public class Swimmers {

  // 游泳行为接口
  private SwimBehavior swimBehavior;

  // 运动员姓名
  private String name;

  // 构造方法
  public Swimmers(SwimBehavior swimBehavior) {
    this.swimBehavior = swimBehavior;
  }

  // 游泳
  public void swim() {
    System.out.print("比赛开始,运动员:" + name);
    swimBehavior.swim();
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    Swimmers swimmers = new Swimmers(new Backstroke());
    swimmers.setName("编程小菜鸟");
    swimmers.swim();
  }
}

执行结果

在这里插入图片描述

总结

1、使用策略模式的关键在于学会分析项目中变化和不变的部分。

2、使用策略模式可以促使代码变得更加有弹性、易于扩展、易于维护。

3、策略模式符合开闭原则,当需要新增行为时只需添加一种策略即可。

4、策略模式的缺点是当策略过多时会导致类的数量庞大。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞、转发加关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。

在这里插入图片描述

程序员如何利用组件知识提升编程技能 本文探讨了程序员如何通过学习和应用API和设计模式来提升自己的编程技能。通过案例分析,说明了如何在编程实践中应用策略模式,并讨论了如何通过探索性学习和针对特定问题的学习来不断积累组件知识,以实现代码的高效重用。 阅读详情

相关推荐

别再怕DRIVER_VERIFIER_DMA_VIOLATION蓝屏:手把手教你用WinDbg分析IOMMU与驱动冲突

本文深入解析DRIVER_VERIFIER_DMA_VIOLATION蓝屏错误,从IOMMU原理到实战排错,手把手教你使用WinDbg分析驱动冲突。通过理解DMA与IOMMU的核心机制、搭建分析环境、解读DMAR表与设备拓扑,最终定位问题驱动并提供解决方案,帮助开发者和IT运维人员有效应对此类系统崩溃问题。

weixin_30298497的博客 803

工厂模式和策略模式区别

工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,对象的创建逻辑被封装在工厂类中,客户端通过调用工厂类的方法来创建所需的对象,而无需直接实例化对象。这样做的好处是隐藏了对象创建的复杂性,提高了代码的封装性和可维护性。简单工厂模式:通过一个工厂类根据传入的参数来决定创建哪一个产品类的实例。这种模式的缺点是工厂类承担了所有的产品创建责任,违反了开闭原则(即对扩展开放,对修改关闭)。工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。

jun778895的博客 2614

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2867

Java策略模式讲解+实现

策略模式作为Java的设计开发模式中,比较常见的一种模式,在实际开发和应用中有着比较重要的作用。但是在很多同学的实际开发中,很容易去搞很多ifelse或者是switch等等。虽然当时写的时候很便捷,但后续维护已经对于代码的整洁来说就很不友好了。这里先引入一下的概念。策略模式可以理解为一种行为模型,什么情况下去做什么,跟ifelse很像,但是它将对象和行为进行分割,通过继承和接口调用来进行行为之间的转化,让实现也就是算法可独立于用户变化。

qq_43881656的博客 584

小程序 video 控制器外观调整_Kessil 360X Tuna Sun无线控制器使用分享

之前分享了Kessil 360X Tuna Sun开箱记录,时间关系,没来得及使用WiFi Dongle无线控制器。昨晚抽空实操了一下,做个操作记录,希望对大家有参考Kessil无线模块操作指南官方视频英文教程配中文字幕,非常详尽语速较快,重点位置可以暂停操作点击边框调出视频工具条1、拆包取控制器,保存二维码Kessil WiFi Dongle包装打开包装就能看到Kessil无线控制模...

weixin_39759060的博客 4734

无人机WIFI集群组网技术详解及成本分析

无人机WIFI集群组网技术是指利用无人机作为移动平台,通过集成高性能的WIFI模块,实现多架无人机之间以及无人机与地面控制站之间的无线通信组网。在协议层面,无人机WIFI集群组网需要遵循标准的无线通信协议,如IEEE 802.11系列(即WIFI标准),同时可能还需定制或优化路由协议、媒体访问控制(MAC)协议等,以确保高效、可靠的数据传输。数据安全与隐私保护:无人机集群组网中传输的数据可能涉及敏感信息,需采取加密、认证等安全措施,确保数据传输的安全性和用户隐私的保护。根据性能不同,价格差异较大。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 1584

策略模式

记得在中学时代,每次考完老师评讲试卷,都会说这道题有多少种解法,然后在黑板上板书第一种、第二种等解法,其实这个情况就类似于今天的情况,也就是策略模式。他表示的是在遇到一种问题有多种解法的时候,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。OK,正式开始今天的文章: 一、理解策略模式 为了更好的理解这个模式,我们再举一个例子,我们出去旅游的时候可能有很多种出行方式,比如说我们可以...

冯冬冬的博客 414

VMware Horizon 8 2111 部署系列(九)创建即时克隆桌面池

即时克隆桌面池是在 vCenter Server 中使用 vmFork 技术(称为即时克隆 API)从最佳配置映像创建的自动桌面池。即时克隆共享同一个基础映像虚拟机,使用基础映像虚拟机的快照创建的,它使用的存储空间也少于完整虚拟机。 即时克隆始终保持开机状态,并在注销后从当前发布的映像重新创建。...

白昼的技术专栏 4043

程序员究竟要做到什么程度才算得上优秀?

作为一个在it行业混的老鸟,一直有一个疑虑:自己究竟要做到什么程度才算得上优秀?一个优秀程序员(指工资比一般程序员高的那种)最重要的能力是什么?写代码的最高境界是什么样的? 带着这个疑虑,我总结了以下几点: 一、 编程能力 不用多说,作为Java程序员,精通Java基础是必须的。这种精通,不是说看了一本《24小时精通XXX》,抄了几个程序就能说精通的,要靠长时间的积累和浸淫。 我曾经看多很多程序员写的代码,在同一个jsp或者java源文件里,出现了三种以上的对方法的命名方式,有下划线间隔的,有全大写

reaijava的博客 556

Week 9 10 Neural Networks

Week 9 10 Neural Networks

金州饿霸吃不饱的博客 404

还原 Windows 环境变量的默认值

有时候,我们可能需要还原环境变量的默认值,以修复可能的配置问题或恢复系统的正常运行。如果您只想还原某个特定的环境变量,可以跳过删除其他变量的步骤,仅删除需要还原的变量即可。在“环境变量”对话框中,继续向下滚动到“系统变量”部分。请注意,在执行以下步骤之前,您应该备份当前的环境变量设置,以便在需要时可以还原。在删除所有需要还原的环境变量后,点击“确定”按钮关闭“环境变量”对话框。在“用户变量”部分,选择需要还原的变量,然后点击“删除”按钮。在“高级”选项卡下方的“环境变量”部分,点击“环境变量”按钮。

PvDeveloper的博客 6342

“有能力”的程序员和“熟练”的程序员谁更牛?

1、“熟练”程序员和“有能力”程序员谁更牛?why?感觉都还可以吧,不过肯定是又熟练又有能力是最好的。相对而言我更喜欢“熟练”的程序员,因为按你的描述,他解决问题的能力更强一点。我在带项目的时候就更喜欢手更熟,更能独立解决问题的人,如果能快速解决问题就更好了。比较不喜欢对于架构啊、模式啊理解的一知半解、乱用、耽误事的人。2、怎么理解所谓的”熟练“和”有能力“ ?应该就是理论和实际执行能力吧。3、程...

qq_41077703的博客 548

《基于YOLOv5/8/10的足球比赛球员识别系统毕设全指南:从开发到部署的一站式实战》

本文提出了一个基于YOLO系列模型的足球球员识别系统,具备完整的开发流程和技术方案。系统通过YOLOv5/8/10三大框架实现球员检测,平衡精度与速度需求。开发过程包含数据标注与增强、模型训练调优、PyQt5界面开发等关键环节,并提供了模型轻量化、多任务扩展等优化方向。系统可实现单张图像和视频流的实时识别,支持跨设备部署,适用于赛事分析和训练复盘场景。项目特色在于完整的技术实现路径和对不同YOLO框架的性能对比,为计算机视觉在体育领域的应用提供实践参考。

m0_71589036的博客 216

优秀Java程序员都具备的五点特性,这些你都有吗?

作为一个在it行业混的老鸟,一直有一个疑虑:自己究竟要做到什么程度才算得上优秀?一个优秀程序员(指工资比一般程序员高的那种)最重要的能力是什么?写代码的最高境界是什么样的? 带着这个疑虑,我总结了以下几点: 一、 编程能力 不用多说,作为Java程序员,精通Java基础是必须的。这种精通,不是说看了一本《24小时精通XXX》,抄了几个程序就能说精通的,要靠长时间的积累和浸淫。 我曾经看多很...

yalin7076的博客 697

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

据说是程序员工作中用到的最多的模式:策略模式解析

这是从零学习设计模式的第一篇文章,也算是入门篇吧。 大家都知道设计模式很重要,掌握设计模式是一个高级开发乃至架构师都必须要具备的技能。 但是不知道有没有这样的感觉,每次看设计模式的概念都差不多能看懂,但是就是不会用,而且不能够识别一些优秀的代码具体是运用了什么设计模式? 最终的结果就是,慢慢的忘记,脑海中的设计模式只是一个很大很虚的概念。 我目前就属于这种状态,为了能够提高自己的编码设计能力,在工作中设计出有弹性,好维护,能更好的应付业务变化的代码,准备认真学习一边设计模式。 其实大学期间就断断续续看过《H

程序员七哥 774

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AI时代如何成为一名优秀的软件工程师:从程序员到架构师的进阶之路

摘要:本文探讨了程序员与软件开发工程师的本质区别,指出工程师的核心能力在于权衡决策(Trade-off)。作者通过自身过度设计邮件系统的案例,说明工程师需要平衡时间、成本和可维护性。建议工程师应深入理解业务、阅读技术思想类书籍、保持技术更新并思考八股背后的原理。文章强调优秀工程师的价值在于决策能力而非单纯编码技术,这种能力是AI难以替代的。最后提出工程之道的本质是在不确定性中做出平衡判断。

TmEnbaby的博客 346

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

优秀程序员应该具备的12种能力

1. 编程语言能力   不用多说,作为合格的计算机程序员,精通一门语言是必须的。这种精通,不是说看了一本编程宝典,抄了几个程序就能说精通的,要靠长时间的积累。   2.编码能力   我曾经看很多程序员写的代码,在同一个jsp或者java源文件里,出现了三种以上的对方法的命名方式,有下划线间隔的,有全大写的,有拼音首字母的。就像一个菜市场,杂乱无比,估计10天后,他自己都无法看的懂

优雅人生 8259

为何我建议你学会“抄”代码?

点击下方“JavaEdge”,选择“设为星标”第一时间关注技术干货!免责声明~任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」;不要急着评判文章列出的观点,只需代入其中,适度审视一番自己即可,能「跳脱出来从外人的角度看看现在的自己处在什么样的阶段」才不为俗人。怎么想、怎么做,全在乎自己「不断实践中寻找适合自己的大道」抄...

JavaEdge全是干货的技术号 1165

老是进入改写模式_策略模式解析

这是从零学习设计模式的第一篇文章,也算是入门篇吧。大家都知道设计模式很重要,掌握设计模式是一个高级开发乃至架构师都必须要具备的技能。 但是不知道有没有这样的感觉,每次看设计模式的概念都差不多能看懂,但是就是不会用,而且不能够识别一些优秀的代码具体是运用了什么设计模式? 最终的结果就是,慢慢的忘记,脑海中的设计模式只是一个很大很虚的概念。我目前就属于这种状态,为了能够提高自己的编码设计能力,在工作中...

weixin_33946174的博客 168

为什么我建议你去学抄代码?

以上这些过程,你想清楚了,作为一个 SOP,以后就能指示 GPT 去写好一个轮子了,当然最快的还是用别人造好的现成轮子吧!虽然经历这么多,你个人的确对如何使用各种高级语法和造轮子有一些实际经验了。再回首,一开始搜到的Spring Retry太复杂了,但Guava就蛮好用,生产还是直接用Guava吧。毕竟能直接拿来用在生产的,何乐而不抄呢?难道你不想六点下班?作为开发者,我们需要保持好奇心和学习热情,不断探索新的技术,只有这样,我们才能在这个快速发展的时代中立于不败之地。介绍一款程序员都应该知道的软件。

xuxian的博客 969

为何我建议你学会抄代码

以上这些过程,你想清楚了,作为一个 SOP,以后就能指示 GPT 去写好一个轮子了,当然最快的还是用别人造好的现成轮子吧!虽然经历这么多,你个人的确对如何使用各种高级语法和造轮子有一些实际经验了。再回首,一开始搜到的Spring Retry太复杂了,但Guava就蛮好用,生产还是直接用Guava吧。毕竟能直接拿来用在生产的,何乐而不抄呢?难道你不想六点下班?关注我,紧跟本系列专栏文章,咱们下篇再续!

JavaEdge全是干货的技术号 1122

深入浅出设计模式系列(二):策略模式

端午节到了,Jacky在家没事做,就跑去自己学长Cook的家串门。两个人聊得甚欢,Cook突然兴起,说,Jacky,今天我让你做个程序题,你想不想做。踌躇满志想成为一个优秀的程序员的Jacky当然毫不犹豫的就答应了。 Jacky:来吧,什么题目啊?没有难度的题目可别出哦! Cook:你小子,长成了是吧?别看到时候出的题目简单,里面学问可不少呢。 Jacky:好吧,那你就别废话了,快...

ayp40545的博客 119

合格程序员应该具备的12种能力

 1. 编程语言能力 不用多说,作为合格的程序员,精通一门语言是必须的。这种精通,不是说看了一本《24小时精通XXX》,抄了几个程序就能说精通的,要靠长时间的积累和浸淫。 2.编码能力 我曾经看多很多程序员写的代码,在同一个jsp或者java源文件里,出现了三种以上的对方法的命名方式,有下划线间隔的,有全大写的,有拼音首字母的。就像一个菜市场,杂乱无比,估计10天后,他自己都无法看的懂。遵守编码规

majiabao123的专栏 699

最新Android面试题整理,终获offer

开头 中国互联网发展的这些年,如今90后程序员是中国程序员的主力军,互联网的热潮也让一批批00后蠢蠢欲动,尝试涌入互联网圈。 当程序员容易,当一个优秀的程序员需要不断学习,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。 二.面试流程 自我介绍 面试官根据你的介绍开始问 你对我们公司有什么想了解的么(复活卡,要时回到没有了也就没有了,可以让面试官给自己提一下建议) 三.面试题回

m0_57066131的博客 107

程序员应该具备能力

不用多说,作为合格的计算机程序员,精通一门语言是必须的。这种精通,不是说看了一本编程宝典,抄了几个程序就能说精通的,要靠长时间的积累。 2.编码能力 我曾经看很多程序员写的代码,在同一个jsp或者java源文件里,出现了三种以上的对方法的命名方式,有下划线间隔的,有全大写的,有拼音首字母的。就像一个菜市场,杂乱无比,估计10天后,他自己都无法看的懂。遵守编码规范,是一个程序员最基本的要求,可悲

chengfangang的专栏 582
上一篇: 不是吧!你还在写if-else吗?快用“状态模式”代替吧
下一篇: 菜鸟程序员都能看懂的“职责链模式”
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值