设计模式:策略模式

ops/2024/9/23 3:29:31/

一,策略模式

策略模式(Strategy Pattern)是一种常用的软件设计模式,属于行为型模式。它的目的是定义一系列算法,并将每个算法封装起来让它们可以互换使用,算法的变化不会影响使用算法的用户。策略模式常用于创建一组可互换的算法,客户端可以根据需要选择不同的算法。

二,特点

  1. 封装性:每个算法都被封装在独立的策略类中,这些类通常实现了相同的接口。

  2. 可互换性:客户端可以通过切换不同的策略实现来改变算法,而不需要修改依赖算法的代码。

  3. 灵活性策略模式使得算法的变化独立于使用算法的客户端。

  4. 易于扩展:可以很容易地添加新的策略,而不需要修改现有代码。

三,组成部分

  • Strategy接口:定义了一个或多个方法,这些方法是策略的具体实现。
  • ConcreteStrategy:实现了Strategy接口的具体策略类。
  • Context:使用Strategy对象的类,它维持一个对Strategy对象的引用,并定义了一个方法用于访问Strategy对象的策略方法。

四,实现步骤

  1. 定义Strategy接口,包含算法的方法。
  2. 创建具体的策略类,实现Strategy接口,并实现具体的算法。
  3. 定义Context类,它有一个Strategy类型的成员变量,用于持有策略对象,并有一个方法用于执行策略。
  4. 客户端代码根据需要选择并初始化相应的策略对象,并将其传递给Context

五,代码

interface Strategy {public int doOperation(int a,int b);
}
class OperationAdd implements Strategy{@Overridepublic int doOperation(int a, int b) {return a + b;}
}
class OperationSubstract implements Strategy{@Overridepublic int doOperation(int a, int b) {return a - b;}
}
class OperationMultiply implements Strategy{@Overridepublic int doOperation(int a, int b) {return a*b;}
}
class Context{//Context类是核心Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}public int cal(int a,int b){return strategy.doOperation(a,b);}
}
public class StrategyDemo{public static void main(String[] args) {Context context = new Context(new OperationAdd());System.out.println(context.cal(2, 3));context =new Context(new OperationMultiply());System.out.println(context.cal(3, 4));}
}


http://www.ppmy.cn/ops/30086.html

相关文章

设计模式之模板模式

模板模式(Template Method Pattern)是行为设计模式之一,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,从而达到复用算法框架…

SpringBoot实现图片上传(个人头像的修改)

SpringBootlayui实现个人信息头像的更改 该文章适合对SpringBoot&#xff0c;Thymeleaf&#xff0c;layui入门的小伙伴 废话不多说&#xff0c;直接上干货 Springbootlayui实现头像更换 前端公共部分代码 HTML页面代码 <div class"layui-card-header" style&quo…

SSM+Vue在线OA办公系统

在线办公分三个用户登录&#xff0c;管理员&#xff0c;经理&#xff0c;员工。 SSM架构&#xff0c;maven管理工具&#xff0c;数据库Mysql&#xff0c;系统有文档&#xff0c;可有偿安装调试及讲解&#xff0c;项目保证质量。需要划到 最底 下可以联系到我。 功能如下&am…

PyCharm更换pip源、模块安装、PyCharm依赖包导入导出

一、Pycharm更换安装源 在下载安装好Pycharm后&#xff0c;一个在实际编程开发过程中非常重要的问题是第三方库添加&#xff0c;然而Python默认的源网络速度有点慢&#xff0c;因此&#xff0c;我们常常需要做的是更换Pycharm的安装源。 在当前最新版&#xff08;2022.03版&…

JavaScript数组

JavaScript数组 数组&#xff08;Array&#xff09;是属于内置对象&#xff0c;数组和普通对象的功能类似&#xff0c;都可以用来存储一些值。不同的是&#xff1a; 普通对象是使用字符串作为属性名&#xff0c;而数组是使用数字作为索引来操作元素。索引&#xff1a;从 0 开…

Axios 库相关

目录 一、含义 二、作用 三、使用 1. 安装 Axios 2. 引入 Axio 3. 发送 GET 请求 4. 发送 POST 请求 5. 设置请求头&#xff1a;通过 headers 选项设置请求头 6. 取消请求&#xff1a;Axios 允许取消请求&#xff0c;可以使用 CancelToken 来实现 一、含义 Axios是一个…

uniapp 异步加载级联选择器(Cascader,data-picke)

目录 Props 事件方法 inputChange事件回调参数说明&#xff1a; completeChange事件回调参数说明&#xff1a; temList 属性Object参数说明 defaultItemList 属性Object参数说明 在template中使用 由于uniapp uni-ui的data-picke 不支持异步作者自己写了一个 插件市场下…

Linux配置双网卡,1NAT 2桥接,ARM板上网

1、简介 版本型号&#xff1a;ubuntu18.04 ARM板型号&#xff1a;6ull本文主要记录配置第一次ubuntu与arm板连接的nfs配置和ARM板上网的配置&#xff0c;按照配置网络、配置nfs系统、给板子连网 顺序进行。该配置的前提是创建ubuntu系统的网络配置选择的是NAT模式&…