策略模式~

news/2024/11/8 3:00:04/

策略模式和简单工厂模式的代码实现非常类似,以至于我很久以来都分不清这两个模式的区别到底在哪,使用场景又有什么区别,因为从实现来讲,简单工厂模式能实现的功能,策略模式都可以实现,事实也是如此。但是简单工厂模式更侧重与创建对象,而策略模式更侧重与对策略的封装 。就是说,这两种模式的区别在于,我们可以通过工厂模式来获取我们想要的对象,既然获取到了对象,我们可以对这个对象做一切可能的操作,比如获取成员变量、作为参数传给其它方法等,但是策略模式,无法获得对象,也就是说我们只能调用策略类给你提供的策略方法。

依旧使用计算器的那个例子,操作符基类和实现都和简单工厂模式一样,我们具体看策略类的实现

public class Context{private Operator op;public Context(Operator op){this.op = op;}public double calculate(double num1, double num2){return op.calculate(num1, num2);}
}

可以看到我们定义的策略类,持有了操作符对象,在调用计算方法的时候调用初始化时传入的操作符的计算方法,达到我们想要的分离运算逻辑的办法,且客户端只需要反复调用 context 对象的 calculate 方法即可。

客户端的使用:

static void Main(String[] args)
{////省略读取输入的部分////加法Context con = new Context(new OperationAdd());Console.WriteLine(con.calculate(num1, num2));//减法con = new Context(new OperationSub());Console.WriteLine(con.calculate(num1, num2));//乘法con = new Context(new OperationMul());Console.WriteLine(con.calculate(num1, num2));//……
}

可以看到客户端可以通过创建不同的Context类完成不同的计算需求,且只能完成计算需求,无法获取运算符对象去进行其它操作,这就是策略模式和简单模式区别的根本。同样,我们也可以对策略进行修改,而不仅仅是调用运算符对象的计算方法。比如我们可以在调用计算方法后,将计算方法的结果进行加密操作,返回密文,这就又是一种新的策略,而客户端只需要调用我们提供的接口即可。

扩展部分

我们可以写一个工具,这个工具用于对某种对象进行排版,排版样式为表格样式,可以排列成N行M列的表格形式,这时我们只需要创建工具策略类 Tool ,保证传入的对象类型都继承自 基类 ToolItem,然后定义SetData接口(总SetData 方法调用每个 Item 的SetData方法)对每个Item的数据进行赋值,最后通过 Tool类的 Show 方法逐个调用每个 Item 的 Show 方法,并且设置每个 Item 的位置。


http://www.ppmy.cn/news/1209200.html

相关文章

使用github copilot

现在的大模型的应用太广了,作为程序员我们当然野可以借助大模型来帮我们敲代码。 下面是自己注册使用github copilot的过程。 一、注册github copilot 1. 需要拥有github账号 ,登录github之后,点右侧自己的头像位置,下面会出现…

esp32-rust-std-examples-blinky

以下为在 ESP-IDF (FreeRTOS) 上运行的 blinky 示例: https://github.com/esp-rs/esp-idf-hal/blob/master/examples/blinky.rs //! Blinks an LED //! //! This assumes that a LED is connected to GPIO4. //! Depending on your target and the board you are …

【Java 进阶篇】Java Listener 使用详解

在 Java Web 应用程序中,监听器(Listener)是一种强大的机制,用于在 Web 容器中监听和响应各种事件。通过监听器,我们可以在应用程序生命周期中执行特定的任务,如在应用启动时初始化资源,在会话创…

纵行科技LPWAN2.0芯片产品ZT1826获“2023年度硬核芯”大奖

2023年10月30日,由深圳市芯师爷科技有限公司主办、慕尼黑华南电子展协办、深圳市半导体行业协会支持的“第五届硬核芯生态大会暨2023汽车芯片技术创新与应用论坛”在深圳国际会展中心1号馆圆满落幕。当晚,“2023年度硬核芯评选”获奖榜单同步揭晓并进行颁…

统一消息分发中心设计

背景 我们核心业务中订单完成时,需要完成后续的连带业务,扣件库存库存、增加积分、通知商家等。 如下图的架构: 这样设计出来导致我们的核心业务和其他业务耦合,每次新增连带业务或者去掉连带业务都需要修改核心业务。 一方面&…

串口通信(11)-CRC校验介绍算法

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

[Hive] CTE 通用表达式 WITH关键字

在Hive中,CTE代表的是Common Table Expression(通用表达式),这是一种SQL语句结构,使用WITH关键字定义的子句。 文章目录 CTE递归 CTE将多个CTE(公共表表达式)写在同一个SQL文件中 CTE CTE提供…

Netty入门指南之NIO 网络编程

作者简介:☕️大家好,我是Aomsir,一个爱折腾的开发者! 个人主页:Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏:Netty应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言基础扫…