设计模式之策略模式和状态模式

1 策略模式

我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法,

我们可以简单理解为更加不同的策略对象,执行不同策略方法。

 

 

 

 

 

 

 

 

2 类图

 

 

 

 

3 代码实现

1)接口:Strategy.java

public interface Strategy {public int doOperation(int num1, int num2);
}

 2)实现类:OperationAdd.java

public class OperationAdd implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 + num2;}
}

3)实现类:OperationSubstract.java

public class OperationSubstract implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 - num2;}
}

4)实现类:OperationMultiply.java

public class OperationMultiply implements Strategy{@Overridepublic int doOperation(int num1, int num2) {return num1 * num2;}
}

5)创建Context.java

public class Context {private Strategy strategy;public Context(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}

StrategyPatternDemo 里面的main函数

public class StrategyPatternDemo {public static void main(String[] args) {Context context = new Context(new OperationAdd());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationSubstract());      System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context = new Context(new OperationMultiply());    System.out.println("10 * 5 = " + context.executeStrategy(10, 5));}
}

 

 

 

4 运行结果

10 + 5 = 15
10 - 5 = 5
10 * 5 = 50

 

 

 

 

 

5 对比状态模式

我们上面策略模式里面的Demo里面每次都是通过传递新的策略对象来构建Context对象,那我们的状态模式可以理解为我们在Context类里面有单独设置策略对象的函数,不需要每次进行构建Context,状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context本身的决策来改变组合的 Strategy 对象

 

 

 

 

 

6 代码实现

我们把上面的Context里面的构造方法里面不要单独进行传递策略对象,我们单独增加一个SetStrategy这样的函数来设置策略改变当前类的策略对象具体的属性值。

Context.java

public class Context {private Strategy strategy;public Context(){}public SetStrategy(Strategy strategy){this.strategy = strategy;}public int executeStrategy(int num1, int num2){return strategy.doOperation(num1, num2);}
}
public static void main(String[] args) {Context context = new Context();    context.SetStrategy(new OperationAdd());    System.out.println("10 + 5 = " + context.executeStrategy(10, 5));context.SetStrategy(new OperationSubstract());    System.out.println("10 - 5 = " + context.executeStrategy(10, 5));context.SetStrategy(new OperationMultiply());          System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}

部分内容参考链接:https://www.runoob.com/design-pattern/state-pattern.html

 

 

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

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

相关文章

AspNetCore7.0源码解读之UseMiddleware

前言本文编写时源码参考github仓库主分支。aspnetcore提供了Use方法供开发者自定义中间件,该方法接收一个委托对象,该委托接收一个RequestDelegate对象,并返回一个RequestDelegate对象,方法定义如下:IApplicationBuild…

《零基础看得懂的C语言入门教程 》——(五)C语言的变量、常量及运算

一、学习目标 了解C语言变量的其它创建方式了解C语言常量了解C语言的运算符 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。 第一篇:(一)脱离学习误区 第二篇:(二&#xff…

实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI

系列文章 实战使用Axure设计App,使用WebStorm开发(1) – 用Axure描述需求 实战使用Axure设计App,使用WebStorm开发(2) – 创建 Ionic 项目 实战使用Axure设计App,使用WebStorm开发(3) – 构建页面架构 实战使用Axure设计App,使用WebStorm开发(4) – 实现页面UI 实战使用Axu…

英文词频统计预备,组合数据类型练习

实例: 下载一首英文的歌词或文章,将所有,.?!等替换为空格,将所有大写转换为小写,统计某几个单词出现的次数,分隔出一个一个的单词。2.列表实例:由字符串创建一个作业评分列表,做增删…

《零基础看得懂的C语言入门教程 》——(六)轻轻松松了解C语言的逻辑运算

一、学习目标 了解逻辑判断的概念了解if语句的使用方法了解switch语句的使用方法了解逻辑运算符的使用方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。 第一篇:(一)脱离学习误区 第二篇&#…

TCP之滑动窗口

一、滑动窗口的基本知识 TCP滑动窗口包含了发送窗口和接收窗口 1)、TCP滑动窗口的最大值 TCP数据包头部里面有个窗口值,默认窗口是一个16bit位字段,表示窗口的字节容量,所以TCP滑动窗口的最大值是2^16-1=65535个字节,TCP里面也有窗口扩大因子可把原来16bit的窗口,扩大为…

《零基础看得懂的C语言入门教程 》——(七)C语言的循环分分钟上手

一、学习目标 了解循环的使用方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。 第一篇:(一)脱离学习误区 第二篇:(二)C语言没那么难简单开发带你了解流程 第…

ArcGIS中数据存放相对路径和绝对路径的区别

配套蓝光视频教程:【ArcGIS风暴】数据相对路径VS绝对路径 问题举例: 菜鸟们在使用ArcGIS时经常会碰到将地图文档(.mxd)拷贝到别的电脑上或改变一个路径时,出现数据丢失的现象,具体表现为图层前面出现一个红色的感叹号,如下图所示。 出现以上问题的根本原因是数据GSS.ti…

TIOBE 5 月编程语言排行榜:C# 最受开发者欢迎,C++ 将冲击 Top 3

技术迭代的速度越来越快,这一点在每月更新一次的编程语言排行榜榜单中体现得尤为明显。今天,最新的 TIOBE 5 月编程语言榜单出炉,不妨一起来看一下又有哪些新的趋势。C# 的使用量增幅最高,C 或将冲击 Top 3和 4 月相比&#xff0c…

SQL Server2016导出数据表数据

SQL Server2016导出数据表数据我们前面已经介绍了很多关于SQL Server的相关文章,今天我们主要介绍的是,如何导出数据库下表中数据。我们所有的操作都是通过SSMS进行操作的。我们右击需要导出数据的数据库----任务----导出数据根据向导提示,下…

Jfinal 显示欢迎页 index.jsp

为什么80%的码农都做不了架构师?>>> IndexController.index()方法,为什么是index()方法?其实这是一个约定 那么它是如何打开index.jsp文件的呢?我们来查看index()方法的代码: public class IndexControlle…

【经典珍藏版】手把手全程教你制作漂亮的720全景地图(附PtGui软件下载地址)

如今,在网络异常发达的信息与智能测绘时代,我们可以在手机、笔记本电脑等多种设备上随时随地看到很漂亮的全景照片,仰以观于天文,俯以察于地理,可以全景图片视频拍摄,可以任意放大缩小、漫游、重力感应、VR眼睛虚拟体验等等,其乐无穷。作为一个GISer,采集地理信息,探索…

一篇文带你从0到1了解建站及完成CMS系统编写

学习目标 了解搭建一般网站的简便方式了解最原始一般站点搭建了解内容管理站点搭建了解权限设计及完成了解使用设计模式减少代码冗余了解前端拖拽页面生成及生成了解自定义数据的创建了解动态生成的前端页如何绑定自定义数据 开发环境 Windows7 *64 SP1php5.6apache/nginxth…

判断输入的整数是否为素数_C语言 | 判断是否素数

“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一”——包租婆这道理放在C语言学习上也一并受用。在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是…

『技术群里聊些啥』Task 不是你想 Cancel,想 Cancel 就能 Cancel

前言在群里看到有人问如何取消这个 Task 的执行:实际上这并不会取消S1eepMode1方法的执行:这是为什么呢?原因首先,让我们看看s_cts.Cancel()都做了啥:public void Cancel() > Cancel(false);public void Cancel(boo…

《零基础看得懂的C语言入门教程 》——(八)了解基本数组还不是那么简单

一、学习目标 了解数组的使用方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。 第一篇:(一)脱离学习误区 第二篇:(二)C语言没那么难简单开发带你了解流程 第…

推导坐标旋转公式(转)

在《Flash actionScript 3.0 动画教程》一书中有一个旋转公式: x1cos(angle)*x-sin(angle)*y; y1cos(angle)*ysin(angle)*x; 其中x,y表示物体相对于旋转点旋转angle的角度之前的坐标,x1,y1表示物体旋转angle后相对于旋转点的坐标 …

任务管理平台_jytask一个任务调度统一管理平台

task介绍和使用https://gitee.com/yuejing/task 下的文档:[doc/task介绍和使用.docx]task是什么?task是一个任务调度统一管理平台。 目前主要是通过http来进行任务的调度,http支持签名算法。一张图能更加懂它是做什么的(一个集中管理任务的平…

设计一个支持百万用户的系统

设计一个支持数百万用户的系统是非常有挑战性的, 这是一个需要不断调整和优化的过程, 接下来的内容中, 我将构建一个系统, 从单个用户开始,到最后支持数百万的用户。从单个服务开始 千里之行,始于足下,让我们从最简单的单个服务开始。所有的…

《零基础看得懂的C语言入门教程 》——(九)C语言二维数组与循环嵌套

一、学习目标 了解二维数组的使用方法了解循环嵌套的使用方法 目录 C语言真的很难吗?那是你没看这张图,化整为零轻松学习C语言。 第一篇:(一)脱离学习误区 第二篇:(二)C语言没那么…