策略模式实现

策略模式:

策略模式是一种行为型设计模式,它允许你定义一系列算法,把它们封装起来,并且使它们可以互相替换。这样,使用算法的客户端代码可以独立于具体的算法实现方式。

就好像是你要去旅行,你可以选择多种不同的交通工具(比如汽车、飞机、火车),每种交通工具都是一种策略。你根据自己的需求和情况选择最适合的交通方式,这就是策略模式的思想。

在策略模式中,通常有三个角色:

  1. 上下文(Context):包含一个策略对象,负责和客户端交互。上下文知道策略对象,并能根据需要调用具体的策略来完成任务。
  2. 策略接口(Strategy Interface):定义了一系列算法的共同行为。通常是一个接口或者抽象类,规定了具体策略类所必须实现的方法。
  3. 具体策略类(Concrete Strategies):实现了策略接口,在具体的策略类中实现了算法。

同样的,来实现一个计算器,他拥有加法、减法、乘法等运算。

策略接口

public interface BaseStratege {int compute(int x,int y);
}

具体策略类

class Add implements BaseStratege {@Overridepublic int compute(int x, int y) {return x+y;}
}class Sub implements BaseStratege {@Overridepublic int compute(int x, int y) {return x-y;}
}

上下文Context

public class Context {private BaseStratege stratege;public Context(BaseStratege stratege) {this.stratege = stratege;}public int compute(int x,int y){return stratege.compute(x,y);}public BaseStratege getStratege() {return stratege;}public void setStratege(BaseStratege stratege) {this.stratege = stratege;}
}

和工厂模式类似,同样先创建一个接口,然后创建对应的实现类,再使用一个Context类来计算结果,但是Context中获取特定实现类的操作,是需要我们手动给定的,也就是说策略模式需要我们记住所需的实现类

 public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int x = scanner.nextInt();int y = scanner.nextInt();int result = new Context(new Add()).compute(x, y);System.out.println(result);}

以上的 Add()类就是需要我们记住的,而不是像工厂一样只需要给定一个特定的条件.

总结:

​ 工厂模式和策略模式在形式上比较相似,但是在实际使用场景中有很大的不同,工厂模式用在能通过某些条件得到确定的实现类,策略模式用在需要我们来判断所需的实现类。

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

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

相关文章

【EI会议征稿中|IEEE出版】第三届信息技术与当代体育国际学术会议(TCS 2023)

【IEEE出版】第三届信息技术与当代体育国际学术会议(TCS 2023) 2023 3rd International Conference on Information Technology and Contemporary Sports 2023年第三届信息技术与当代体育国际学术会议(TCS 2023)将于2023年12月2…

Dueling DQN 跑 Pendulum-v1

gym-0.26.1 Pendulum-v1 Dueling DQN 因为还是DQN,所以我们沿用double DQN,然后把 Qnet 换成 VAnet。 其他的不变,详情参考前一篇文章。 class VA(nn.Module):"""只有一层隐藏层的A网络和V网络"""def __init__(self, state_dim, hidd…

子目录文件夹图片汇总

import os import shutildef collect_images(source_folder, target_folder):# 遍历主文件夹及其所有子文件夹for root, dirs, files in

位1的个数

题目链接 位1的个数 题目描述 注意点 输入必须是长度为 32 的 二进制串 解答思路 位运算判断每一位是否为1 代码 public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n) {int res 0;for (int i 0; i < 32; i) {res …

项目经理和产品经理该如何选择?

最近很多人咨询“项目经理跟产品经理该怎么选&#xff0c;我更适合哪个&#xff1f;”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等&#xff0c;今天就一次性说清楚项目经理跟产品经理有什么区别&#xff0c;应该怎么选择。 不想看长篇大论的&#x…

Python+Pytest接口自动化之HTTP协议基础

HTTP协议简介 HTTP 即 HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09;&#xff0c;是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。 设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。HTTP 协议在 OSI 模型…

Kubernetes版本升级到v1.18.0方法

升级k8s版本才能使用kube-prometheus安装监控 1、查看集群状态 [rootk8s-master k8s-script]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 5d22h v1.18.0 k8s-slave1 Ready <none> 4d10h v1.18.0 k…

ActiveMQ使用指南

介绍 ActiveMQ是Apache开源组织旗下的一个项目&#xff0c;是一个流行的开源消息中间件。它完全支持JMS1.1和J2EE1.4规范的JMS Provider实现&#xff0c;并且是纯Java开发的产品。ActiveMQ支持多种语言编写客户端&#xff0c;包括C,C,C#,Perl,PHP,Ruby,Ajax等&#xff0c;同时…

php5, php7,php8 有什么区别

PHP 5、PHP 7 和 PHP 8 是 PHP 编程语言的不同版本&#xff0c;它们之间有许多改进和变化。以下是它们的一些主要区别&#xff1a; 1. 性能提升&#xff1a; PHP 5&#xff1a; PHP 5.x 版本的性能相对较低&#xff0c;特别是在处理大量并发请求和执行大型应用程序时。 PHP 7…

做数据分析为何要学统计学(6)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法&#xff08;不受总体分布因素的限制&#xff09;&#xff0c;在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性&#xff0c;造成时常被误用。本文参阅相关的文献&#xff0c;对卡方检验的适用性进行粗浅…

【unity】如何用Unity获取Windows桌面

【背景】 默认的Unity可实现的屏幕共享仅仅针对Unity编辑器的编辑窗口中的Camera展现的内容。本篇研究如何实现用Unity实时反映Windows桌面窗口画面。 【准备插件】 下载地址&#xff1a; https://download.csdn.net/download/weixin_41697242/88623496 将解压后的文件夹直…

Feign-自定义配置

目录 一、自定义Feign配置 二、修改日志级别 方式一&#xff1a;application配置文件方式 方式二&#xff1a;java代码方式 三、总结 一、自定义Feign配置 二、修改日志级别 配置Feign日志有两种方式 方式一&#xff1a;application配置文件方式 &#xff08;1&#xff09…

目标检测DOTA数据集提取感兴趣类别数据

DOTA数据集 DOTA数据集包含2806张航空图像&#xff0c;尺寸大约从800x800到4000x4000不等&#xff0c;包含15个类别共计188282个实例。其标注方式为四点确定的任意形状和方向的四边形&#xff08;区别于传统的对边平行bbox&#xff09;。类别分别为&#xff1a;plane, ship, s…

前端八股文

前端八股文 目录 前端八股文1.css选择优先级&#xff1f;2.px与rem区别&#xff1f;3.重绘与重排的区别&#xff1f;4.元素水平垂直居中的方法&#xff1f;5.什么是闭包&#xff0c;闭包有什么特点&#xff1f;6.什么是事件委托&#xff1f;7.什么是原型链&#xff1f;8.new操作…

交易历史记录20231205 记录

昨日回顾&#xff1a; select top 10000 * from dbo.CODEINFO A left join dbo.全部&#xff21;股20231205010101 B ON A.CODE B.代码 left join dbo.全部&#xff21;股20231205CONF D on A.CODED.代码left join dbo.全部&#xff21;股20231205 G on A.CODEG.代码 left…

LeetCode-合并有序链表问题

1.合并两个有序链表 题目描述&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路&#xff1a; 首先建立一个头节点方便后续操作&#xff0c;然后开始循环将两个链表的节点值进行比较&#xff0c;如果list1…

A Piece of Cake

A Piece of Cake 题目链接 题意 输出一个整数表示a[n]的总和 思路 输入数组a[n]在for循环中确定数学式子ans等于它本身加上数学式子 坑点 for循环中i要从0开始&#xff0c;不然a[1] 2 x a[2] 3 x a[3] … a[0] x a[a[0]]的值就会出错&#xff0c;2 x a[2]就会变成 3 x a[…

fastapi实现websocket在线聊天

最近要实现一个在线聊天功能&#xff0c;基于fastapi的websocket实现了这个功能。下面介绍一下遇到的技术问题 1.问题难点 在线上环境部署时&#xff0c;一般是多进程的方式进行部署启动fastapi服务&#xff0c;而每个启动的进程都有自己的独立存储空间。导致存储的连接对象分…

Windows Subsystem for Linux (WSL) 安装与使用笔记

文章目录 Part.I IntroductionPart.II 安装Chap.I 安装流程Chap.II 迁移至其他盘 Part.III 使用Chap.I 一些信息Chap.II 配置下载软件的源Chap.III 安装 pip Reference Part.I Introduction Windows Subsystem for Linux 简写为 WSL&#xff0c;是 Windows 的一个 Linux 子系统…

常用的建表但范式、反规范化

规范化&#xff1a; 规范化是用于数据库设计的一系列原理和技术&#xff0c;它可以减少表中数据的冗余&#xff0c;增加数据完整性和一致性。通常有很多范式。 第一范式&#xff08;1NF&#xff09;&#xff1a; 常用的三种范式&#xff1a; 表中的字段都是不可再分割的原子属…