前言

当代码中出现多重if-else语句或者switch语句时。弊端之一:如果这样的代码出现在多处,那么一旦出现需求变更,就需要把所有地方的if-else或者switch代码进行更改,要是遗漏了某一处,那么程序就会出错。弊端之二:代码逻辑难以理解,可读性低。

卫语句

if (isSunshine()) {// 晴天时处理逻辑return xx;
}
if (isRain()) {// 下雨时处理逻辑
}
if (isOvercast()) {// 阴天时处理逻辑
}

策略模式

使用策略模式可以代替多重if-elseswitch语句,让代码维护变得更加简单。 
策略模式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(转)相关推荐

  1. Java 设计模式之状态模式

    一.了解状态模式 1.1 什么是状态模式 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它自己的类. 状态模式将状态封装为独立的类,并将动作委托到代表当前状态的对象. 1.2 状态 ...

  2. 图解java多线程设计模式 pdf_图解Java设计模式之状态模式

    图解Java设计模式之状态模式 APP抽象活动问题 状态模式基本介绍 状态模式的原理类图 状态模式解决APP抽奖问题 状态模式的注意事项和细节 APP抽象活动问题 请编写程序完成APP抽象活动,具体要 ...

  3. Java 有限状态机 (设计模式——状态模式)

    Java 有限状态机 (设计模式--状态模式) 编写代码的时候,有时会遇见较为复杂的swith...case...和if...else...语句.这一刻有时会想到状态机,用有限状态机替换swith.. ...

  4. java设计模式之状态模式_Java中的状态设计模式

    java设计模式之状态模式 在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式. 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用. 当对象的行为取决于其当前状态时,我们 ...

  5. 【Java设计模式】状态模式

    ? 在很多情况下,一个对象的行为取决于一个或多个动态变化的属性,这样的属性叫做状态,这样的对象叫做有状态的( stateful)对象,这样的对象状态是从事先定义好的一系列值中取出的.当一个这样的对象与 ...

  6. 《设计模式详解》行为型模式 - 状态模式

    状态模式 6.5 状态模式 6.5.1 反例 6.5.2 结构 6.5.3 案例实现 6.5.4 优缺点 6.5.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 行为型 ...

  7. 设计模式 — 行为型模式 — 状态模式

    目录 文章目录 目录 状态模式 应用场景 代码示例 状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程. 优点: 封装了状态转换规则. 枚举了可能的状态,在枚举状态之前需要确 ...

  8. 行为型模式——状态模式(十一)

    该项目源码地址:https://github.com/ggb2312/JavaNotes/tree/master/design-pattern(设计模式相关代码与笔记) 1. 定义 允许一个对象在其内 ...

  9. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

  10. 【状态模式】Java设计模式之状态模式

    何时使用 State模式在实际使用中比较多,适合"状态"的切换.因为我们经常会使用If else if else 进行状态切换,如果针对状态的这样判断切换反复出现,我们就要联想到是 ...

最新文章

  1. 高级转录组分析和R数据可视化第11期(课程推迟,可先报名,时间另行告知)
  2. .net操纵xml文件类(c#)
  3. redis 导出导入详解
  4. Eclipse中安装freemarker插件
  5. please reinstall the mysql distribution_php安装扩展mysqli的实现步骤及报错解决办法
  6. Linux nm命令
  7. linux看是不是db2实例用户,切换到实例用户以后不能执行 db2
  8. 怎么样更好的做好站内的优化
  9. 邮件合并保存为一个个单独的文档_你还在为考计算机二级烦恼吗? 基本操作步骤分享...
  10. 自动驾驶3-3 自动驾驶的安全框架 Safety Frameworks for Self-Driving
  11. 【数学和算法】矩阵运算的相关公式
  12. 五种常用的3D建模方式,各有什么优缺点?
  13. 模拟CMOS集成电路设计 学习笔记(三)
  14. AutoRunner检查点之校验属性
  15. Python基础知识从hello world 开始(第三天)
  16. 苹果屏蔽更新描述文件_屏蔽iPhone更新的iOS描述文件安装办法
  17. javascript编写1加到100函数
  18. [NowCoder5673E]Enigmatic Partition
  19. 计算机科学与技术的心理测试考试,考试中的心理测评是什么?
  20. linux 内存清理/释放命令

热门文章

  1. Maven添加本地Jar包方案1
  2. rsync文件同步、Inotify-tools参数详解
  3. 【零基础学习iOS开发】【02-C语言】08-基本运算
  4. php用户鉴权,app开发之鉴权 PHP版
  5. VS2013和MATLAB相互调用混合编程
  6. Vivado下生成及烧写MCS文件
  7. 二相并行FIR滤波器的matlab及使用FIR IP 核的FPGA实现
  8. Xilinx FFT IP core V9.0的介绍和使用
  9. 数组公式基本功修炼之初步使用
  10. 虚拟机下Linux安装图解之四:VMware Tools 的安装