设计模式之策略模式和状态模式
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
设计模式之策略模式和状态模式相关推荐
- 【设计模式】 模式PK:策略模式VS状态模式
1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Cont ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- 设计模式之模板方法模式、策略模式、命令模式、责任链模式、状态模式
前言 本章节给您介绍23种设计模式的行为型模式中的模板方法模式.策略模式.命令模式.责任链模式.状态模式. 如有帮助记得3连 加 关注哦!欢迎品论去留言交流,谢谢阅读! 文章目录 前言 一.模板方法模 ...
- 【设计模式】策略模式VS状态模式
在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式. 但根据两者的定义,我们发现两 ...
- java输出不同颜色_Java设计模式-策略模式、状态模式
推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...
- Java设计模式之行为型:状态模式
背景: 介绍状态模式前,我们先看这样一个实例:公司力排万难终于获得某个酒店的系统开发项目,并且最终落到了你的头上.下图是他们系统的主要工作: 当第一眼看到这个系统时你就看出这是一个状态图,每个框都代表 ...
- 对策略模式与状态模式的一点思考
在以前的一片博文里 http://www.cnblogs.com/mightofcode/archive/2012/11/19/2771216.html,我发表了我对设计模式的一点看法 但是今天的一个 ...
- 策略模式 VS 状态模式
在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式. 但根据两者的定义,我们发现两 ...
- 设计模式(十五)状态模式
相关文章 设计模式系列 前言 建议在阅读本文前先阅读设计模式(十一)策略模式这篇文章,虽说状态模式和策略模式的结构几乎是相同的,但是它们所解决的问题是不同的,读完这两篇文章你就会有了答案. 1.状态模 ...
- 颜值10分姐姐带我玩转java设计模式(内附照片)- 状态模式
先不说话,直接来张姐姐照片,称呼上官姐姐即可,希望上官姐姐能带飞 原创不易,麻烦先三连,再细看,谢谢 示例的源码可以直接通过csdn下载也可以通过git导出:https://github.com/ig ...
最新文章
- 西湖大学鞠峰组:环境微生物的宏基因组学实例与新发现
- ReplaceForm.cs
- Android之线程安全的单例模式,Adapter注意事项之引用传值
- 定义工厂(Plant)
- python leetcode_leetcode 介绍和 python 数据结构与算法学习资料
- ae可围绕帧拖动放大插件:Drag Zoom Pro for AE mac(兼容M1)
- get请求400错误 vue_vue用get请求,一个很奇怪的现象
- 简单java程序_简单的Java程序
- Matlab读nc文件
- 企业微信发送消息php,PHP实现微信模板消息发送给指定用户
- 阻塞IO和NIO的区别
- hadoop工作原理
- 「Linux」- 修改鼠标滚轮的滚动方向 @20210315
- JAVA是解释型语言还是编译型语言
- NPOI导出word,NPOI导出word表格,NPOI复制table表格 XWPFDocument中XWPFTable
- android棉花糖,Android-6.0 棉花糖权限的那点事
- 用于针对DNN中后门攻击的蒸馏对策和中毒数据的去除
- deeplabv3+训练自己的数据集
- IDEA统计代码总行数———————插件管理
- 二维数组迷宫求解c语言,c语言写的迷宫问题
热门文章
- C# GTS四轴运动控制器实例(固高科技步进电机不带编码器) -V1
- 16年微软/腾讯云/华为云MVP是怎样炼成的
- VS Code + ML.NET 玩转交互式机器学习
- 程序出Bug,一定是环境的锅!
- C# Span 源码解读和应用实践
- 【源码】常用的人脸识别数据库以及上篇性别识别源码
- 程序员过关斩将--搞定秒杀,只需要这几步!!
- 七国要求科技巨头预留后门 应对马甲芯片高度警惕
- 《ASP.NET Core 微服务实战》-- 读书笔记(第5章)
- .NET Core 3中的性能提升(译文)