Java设计模式-策略模式

img

简介

在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。

策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。

实现

在Java编程语言中,实现策略模式需要以下几个关键元素:策略接口、具体策略类和环境类。

首先,定义一个策略接口,其中包含策略类共有的方法。例如:

public interface Strategy {
    void execute();
}

接下来,创建具体策略类,实现策略接口并实现具体的算法。例如:

public class ConcreteStrategyA implements Strategy {
    @Override
    public void execute() {
        // 具体算法A的实现
    }
}

public class ConcreteStrategyB implements Strategy {
    @Override
    public void execute() {
        // 具体算法B的实现
    }
}

然后,定义一个环境类,用于持有策略对象并在运行时切换不同的策略。例如:

public class Context {
    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public void executeStrategy() {
        strategy.execute();
    }
}

通过以上实现,我们可以根据需要选择不同的具体策略类,并通过环境类进行调用。例如:

Strategy strategyA = new ConcreteStrategyA();
Context context = new Context(strategyA);
context.executeStrategy();

Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyB);
context.executeStrategy();

优缺点

优点

  1. 策略类之间相互独立,易于扩展和维护。
  2. 可以在运行时动态切换策略,灵活性高。
  3. 提供了一种可替代继承的方案,避免继承层次的臃肿。

缺点

  1. 客户端需要了解不同的策略类,增加了使用的复杂度。
  2. 策略模式增加了类的数量,可能会导致系统更加庞大。

运用场景

策略模式适用于以下场景:

  1. 需要在不同算法之间灵活切换的情况。
  2. 有多个类似的条件语句,可以使用策略模式提取出这些条件逻辑。
  3. 需要封装一些具体的算法,使其独立于客户端而变化。

总结

策略模式是一种灵活的行为型设计模式,通过封装不同的算法成为独立的策略类,使得这些算法可以在运行时相互替换。通过定义策略接口、具体策略类和环境类,我们可以在Java中实现策略模式。该模式具有灵活性高、易于扩展和维护等优点,适用于需要动态切换算法或封装具体算法的场景。然而,策略模式也需要客户端了解不同的策略类,增加了复杂度,并可能导致系统庞大。

总而言之,策略模式是一种强大而灵活的设计模式,可以提供可复用的算法解决方案。通过合理地应用策略模式,我们可以提高代码的灵活性、可扩展性和可维护性,从而更好地应对不同的业务需求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【halcon资料】取出区域的轮廓上所有转折点

一、说明 在区域运算的时候,有时候需要用图形的顶点来描述,比如,两个图中对象需要对齐,或者仿射变换,于是特征点是需要提取的。本文给出一个提取顶点的示例。 二、算子 1.1 get_region_polygon算子 (1&a…

高级树结构

二叉排序树 左子树中所有结点的值,均小于其根结点的值。 右子树中所有结点的值,均大于其根结点的值。 二叉搜索树的子树也是二叉搜索树。 注意: 1.二叉查找树不能插入重复元素 2.中序遍历是一个递增的数列 3.高度越小查询效率越高 二叉排序…

设备采购信息管理系统

系列文章 任务14 设备采购信息管理系统 文章目录 系列文章一、实践目的与要求1、目的2、要求 二、课题任务三、总体设计1.存储结构及数据类型定义2.程序结构3.所实现的功能函数4、程序流程图 四、小组成员及分工五、 测试界面展示添加采购信息按编号查找采购信息按设备编号查找…

macOS Ventura 13.5beta (22G5027e)发布

系统介绍 黑果魏叔 5 月 20 日消息,苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 更新(内部版本号:22G5027e),本次更新距离上次发布隔了 17 天。 macOS Ventura 带来了台前调度、连续互通相机、Face…

【SpringBoot】SpringBoot 纯后端项目如何自定义异常页面(Whitelabel Error Page)

文章目录 背景安排方案步骤 验证 背景 一个短链服务,业务将长链接给我,我转换成短地址,用户访问短地址时,我再做redirect;没有前端,纯后端项目短链会有过期时间,过期后将返回错误信息某一天一个…

本地电脑做服务器搭建私人音乐网站ThinkMusic + cpolar内网穿透

文章目录 1. 前言2. 本地网页搭建2.1 环境使用2.2 支持组建选择 3. 网页安装3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转发自CSDN lisacpolar的文章:ThinkMusic源码搭建音乐网站,并实现公网访问 1. 前言 在我们的日…

Redis 概述

1. NoSQL 数据库简介 技术发展: 技术的分类 1、解决功能性的问题: Java、 Jsp、 RDBMS、 Tomcat、 HTML、 Linux、 JDBC、 SVN2、解决扩展性的问题: Struts、 Spring、 SpringMVC、 Hibernate、 Mybatis3、解决性能的问题: NoSQL、 Java 线…

MacBook杀毒软件CleanMyMac X2023

Mac 上也广泛存在恶意软件,并且能够突破系统自身的防护,通过渠道传播到电脑上,威胁大家的数据安全和窃取个人信息!所以,MacBook杀毒软件还是很有必要安装的。 始于颜值,忠于实力。CleanMyMac X是我用过UI风…

Java 与排序算法(3):插入排序

一、插入排序 插入排序(Insertion Sort)是一种简单直观的排序算法,它的基本思想是将待排序序列分为已排序区间和未排序区间,然后每次从未排序区间取出一个元素,将其插入到已排序区间的合适位置中,使得插入…

【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析

【Linux0.11代码分析】09 之 ELF可执行程序02 - Section Headers解析 一、ELF概述二、ELF的组成结构2.1 ELF header:解析出 section headers 含31个section节和 program headers 含13个segment段2.2 Section Headers:获取当前程序的31个section节区信息2…

极狐(GitLab) 重磅发布新产品「极狐星」,让研发效能看得清,算得准,成就企业精英效能管理

在研发驱动业务增长的今天,越来越多的研发管理者发现: 总是觉得研发资源不够用? 如何用数据衡量研发效能? 如何定位软件交付瓶颈? 怎样管理并预警项目状态? 想尽早发现代码泄露风险怎么办?…

CleanMyMac X如何下载解锁完整版本?

这是一款很受到mac用户喜爱的清理软件。不仅清理文件的步骤十分简单,电脑小白用户也可以高效清理Mac电脑。作为一款全方位保护电脑的软件,CleanMyMac已经不满足于只做简单的Mac清理工具,而是为mac用户提供更多的实用功能:优化系统…

Redis三种集群模式

一、引言 Redis有三种集群模式,第一个就是主从模式,第二种“哨兵”模式,第三种是Cluster集群模式,第三种的集群模式是在Redis 3.x以后的版本才增加进来的,我们今天就来说一下Redis第一种集群模式:主从集群模…

Halcon 算子 select_shape_std 和 select_shape_xld区别

文章目录 1 select_shape_std 算子介绍2 select_shape_xld算子介绍3 select_shape_std 和 select_shape_xld区别4 Halcon 算子的特征 Features 列表介绍1 select_shape_std 算子介绍 select_shape_std (Operator) Name select_shape_std — Select regions of a given shape.Si…

【嵌入式烧录刷写文件】-2.4-移动Intel Hex中指定地址范围内的数据

案例背景(共5页精讲): 有如下一段Hex文件,将源地址范围0x9100-0x9104中数据,移动至一个“空的,未填充的”目标地址范围0xA000-0xA004。 :2091000058595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F70717…

【C++】类和对象(上)

【C】类和对象 前言遗漏的部分内联函数使用注意 语法糖auto循环(:) 正篇:面向对象(上)面向对象的思路类和对象stuct的升级对象class封装(private protect public)定义和声明分离this…

Vue3通透教程【十二】TS类型声明优势

文章目录 🌟 写在前面🌟 上篇文章解惑🌟 JS函数中的隐患🌟 函数中的类型🌟 写在最后 🌟 写在前面 专栏介绍: 凉哥作为 Vue 的忠实 粉丝输出过大量的 Vue 文章,应粉丝要求开始更新 V…

2023-5-19-Debug和Release到底有多少不同?

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

垃圾站养殖场除臭杀菌解决方案

养殖场和垃圾站都会产生大量的有机废气和垃圾,这些废气和垃圾会产生难闻的臭味,影响周围环境和居民健康。这些地方又是病菌和细菌的滋生地,这些细菌和病菌会对人类和动物的健康造成威胁。除臭杀菌系统可以杀灭这些细菌和病菌,也可…

【Java|golang】1080. 根到叶路径上的不足节点--dfs

给你二叉树的根节点 root 和一个整数 limit ,请你同时删除树中所有 不足节点 ,并返回最终二叉树的根节点。 假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为 不足节点 ,需要被删…