java - 策略模式、状态模式、卫语句,避免多重if-else(转)
前言
当代码中出现多重if-else
语句或者switch
语句时。弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else
或者switch
代码进行更改,要是遗漏了某一处,那么程序就会出错。弊端之二:代码逻辑难以理解,可读性低。
卫语句
if (isSunshine()) {// 晴天时处理逻辑return xx; } if (isRain()) {// 下雨时处理逻辑 } if (isOvercast()) {// 阴天时处理逻辑 }
策略模式
使用策略模式可以代替多重if-else
和switch
语句,让代码维护变得更加简单。
策略模式UML:
.环境(Context)角色:持有一个Strategy的引用
.抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现
.具体策略(ConcreteStrategy)角色:包装了相关的算法或行为
策略模式代码模板
package com.zzk.test.strategy.template;import com.zzk.test.strategy.template.base.Strategy;/*** @描述 环境角色*/ public class Context {/*** 策略对象*/private Strategy strategy;/*** @param strategy 具体策略对象*/public Context(Strategy strategy) {this.strategy = strategy;}/*** @描述 执行策略方法*/public void contextInterface() {strategy.strategyInterface();} }
package com.zzk.test.strategy.template.base;/*** @描述 抽象策略角色*/ public interface Strategy {/*** @描述 策略方法*/void strategyInterface(); }
package com.zzk.test.strategy.template;import com.zzk.test.strategy.template.base.Strategy;/*** @描述 具体策略类A*/ public class ConcreteStrategyA implements Strategy {@Overridepublic void strategyInterface() {// TODO Auto-generated method stub } }
package com.zzk.test.strategy.template;import com.zzk.test.strategy.template.base.Strategy;/*** @描述 具体策略类B*/ public class ConcreteStrategyB implements Strategy {@Overridepublic void strategyInterface() {// TODO Auto-generated method stub } }
package com.zzk.test.strategy.template;import com.zzk.test.strategy.template.base.Strategy;/*** @描述 具体策略类C*/ public class ConcreteStrategyC implements Strategy {@Overridepublic void strategyInterface() {// TODO Auto-generated method stub } }
调用者
/*** @描述 使用策略模式:针对一组算法,将每一个算法封装到具有共同接口的独立的类*/public static void useStrategy() {// 具体使用策略Strategy strategy = new ConcreteStrategyA();// 将策略放入环境中并执行策略new Context(strategy). contextInterface();}
状态模式
状态模式类图
环境(Context)角色,也成上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有状态 抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为 具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为
策略模式代码模板:
package xyz.zeling.test.state.template.base;/*** @description 抽象状态角色* @author zeling* @date 2018年1月14日 下午8:41:14*/ public interface State {/*** @description 处理方法* @date 2018年1月14日 下午8:41:00*/void handle(); }
package xyz.zeling.test.state.template;import xyz.zeling.test.state.template.base.State;/*** @description 具体状态类A* @author zeling* @date 2018年1月14日 下午8:45:00*/ public class ConcreteStateA implements State {@Overridepublic void handle() {// TODO Auto-generated method stub } }
package xyz.zeling.test.state.template;import xyz.zeling.test.state.template.base.State;/*** @description 具体状态类A* @author zeling* @date 2018年1月14日 下午8:45:00*/ public class ConcreteStateB implements State {@Overridepublic void handle() {// TODO Auto-generated method stub } }
package xyz.zeling.test.state.template;import xyz.zeling.test.state.template.base.State;/*** @description 具体状态类A* @author zeling* @date 2018年1月14日 下午8:45:00*/ public class ConcreteStateC implements State {@Overridepublic void handle() {// TODO Auto-generated method stub } }
package xyz.zeling.test.state.template;import xyz.zeling.test.state.template.base.State;/*** @description 状态模式,环境角色类* @author zeling* @date 2018年1月14日 下午8:43:58*/ public class Context {/*** 状态对象*/private State state;/*** @description 设置状态* @date 2018年1月14日 下午9:13:20* @param state 具体状态*/public void setState(State state) {this.state = state;}/*** @description 执行策略方法* @date 2018年1月14日 下午8:43:31*/public void request() {state.handle();} }
调用者
/*** @description 使用状态模式:状态模式,又称状态对象模式(Pattern of Objects for* States),状态模式是对象的行为模式。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样* @date 2018年1月14日 下午4:04:16*/public static void useState() {// 具体使用状态State state = new ConcreteStateA();// 创建环境Context context = new Context();// 设置状态并执行 context.setState(state);context.print();}
策略模式和状态模式的比较
讲真,我觉得它们都差不多啊,好难区别啊!!!
不过,虽然讲不出来它们的区别是什么,但是有个例子可以很好的描述它们的区别
.状态模式:这个模式就好比员工申请离职单的流程,离职单到直接上级,这个状态就是直接上级批示,等直接上级审阅之后,通过了就到下一个状态。这一个个状态对应不同的处理,这是有顺序要求的。 .策略模式:这个模式好比于你假期要出国游玩,有日本、美国、新加坡等国家,你每到一个国家就执行不同的游玩策略,可以先去日本,也可以先去美国,没有顺序要求。
转载于:https://www.cnblogs.com/zk-tx/p/10260511.html
java - 策略模式、状态模式、卫语句,避免多重if-else(转)相关推荐
- Java 设计模式之状态模式
一.了解状态模式 1.1 什么是状态模式 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它自己的类. 状态模式将状态封装为独立的类,并将动作委托到代表当前状态的对象. 1.2 状态 ...
- 图解java多线程设计模式 pdf_图解Java设计模式之状态模式
图解Java设计模式之状态模式 APP抽象活动问题 状态模式基本介绍 状态模式的原理类图 状态模式解决APP抽奖问题 状态模式的注意事项和细节 APP抽象活动问题 请编写程序完成APP抽象活动,具体要 ...
- Java 有限状态机 (设计模式——状态模式)
Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...
- java设计模式之状态模式_Java中的状态设计模式
java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...
- 【Java设计模式】状态模式
? 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的( stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的对象与 ...
- 《设计模式详解》行为型模式 - 状态模式
状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...
- 设计模式 — 行为型模式 — 状态模式
目录 文章目录 目录 状态模式 应用场景 代码示例 状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程. 优点: 封装了状态转换规则. 枚举了可能的状态,在枚举状态之前需要确 ...
- 行为型模式——状态模式(十一)
该项目源码地址:https://github.com/ggb2312/JavaNotes/tree/master/design-pattern(设计模式相关代码与笔记) 1. 定义 允许一个对象在其内 ...
- Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...
- 【状态模式】Java设计模式之状态模式
何时使用 State模式在实际使用中比较多,适合"状态"的切换.因为我们经常会使用If else if else 进行状态切换,如果针对状态的这样判断切换反复出现,我们就要联想到是 ...
最新文章
- 高级转录组分析和R数据可视化第11期(课程推迟,可先报名,时间另行告知)
- .net操纵xml文件类(c#)
- redis 导出导入详解
- Eclipse中安装freemarker插件
- please reinstall the mysql distribution_php安装扩展mysqli的实现步骤及报错解决办法
- Linux nm命令
- linux看是不是db2实例用户,切换到实例用户以后不能执行 db2
- 怎么样更好的做好站内的优化
- 邮件合并保存为一个个单独的文档_你还在为考计算机二级烦恼吗? 基本操作步骤分享...
- 自动驾驶3-3 自动驾驶的安全框架 Safety Frameworks for Self-Driving
- 【数学和算法】矩阵运算的相关公式
- 五种常用的3D建模方式,各有什么优缺点?
- 模拟CMOS集成电路设计 学习笔记(三)
- AutoRunner检查点之校验属性
- Python基础知识从hello world 开始(第三天)
- 苹果屏蔽更新描述文件_屏蔽iPhone更新的iOS描述文件安装办法
- javascript编写1加到100函数
- [NowCoder5673E]Enigmatic Partition
- 计算机科学与技术的心理测试考试,考试中的心理测评是什么?
- linux 内存清理/释放命令