状态模式涉及到的类有:
1.上下文,拥有一个或多个状态类实例,对客户端暴露接口;
2.状态接口,封装具体状态类所对应的行为;
3.具体状态类,真正实现状态行为。
状态模式允许一个对象在其内部状态改变的时候改变其行为。
类图如下
代码示例:
先看一下之前同事写的代码:
@Override public List<DrlTypeDTO> getDrlOperationDTO(String typeId) { List<Operation> list = Operation.list; List<Operation> operationList = new ArrayList<>(); //字符串类型(等于,不等于,被包含于,不被包含于,不为空,为空,匹配,不匹配) if (DataType.STR.getValue().toString().equals(typeId)) { for (int i = 0; i < list.size(); i++) { if (!list.get(i).getIndex().equals(Operation.GRE.getIndex()) && !list.get(i).getIndex().equals(Operation.GREEQL.getIndex()) && !list.get(i).getIndex().equals(Operation.LESS.getIndex()) && !list.get(i).getIndex().equals(Operation.LESSEQL.getIndex()) && !list.get(i).getIndex().equals(Operation.BET.getIndex()) && !list.get(i).getIndex().equals(Operation.CONTAINS.getIndex()) && !list.get(i).getIndex().equals(Operation.EXCLUDES.getIndex())) { operationList.add(list.get(i)); } } //数值类型(等于,大于,大于等于,小于,小于等于,不等于,被包含于,不被包含于,不为空,为空) } else if (DataType.INT.getValue().toString().equals(typeId) || DataType.FLOAT.getValue().toString().equals(typeId) || DataType.DOUBLE.getValue().toString().equals(typeId)) { for (int i = 0; i < list.size(); i++) { if (!list.get(i).getIndex().equals(Operation.MATCHES.getIndex()) && !list.get(i).getIndex().equals(Operation.NMATCHES.getIndex()) && !list.get(i).getIndex().equals(Operation.BET.getIndex()) && !list.get(i).getIndex().equals(Operation.CONTAINS.getIndex()) && !list.get(i).getIndex().equals(Operation.EXCLUDES.getIndex())){ operationList.add(list.get(i)); } } //布尔类型(等于,不等于,不为空,为空) } else if (DataType.BOOLEAN.getValue().toString().equals(typeId)) { for (int i = 0; i < list.size(); i++) { if (list.get(i).getIndex().equals(Operation.EQL.getIndex()) || list.get(i).getIndex().equals(Operation.NEQL.getIndex()) || list.get(i).getIndex().equals(Operation.NULL.getIndex()) || list.get(i).getIndex().equals(Operation.NOTNULL.getIndex())){ operationList.add(list.get(i)); } } //数组类型(包含,不包含,不为空,为空) } else if (DataType.STRS.getValue().toString().equals(typeId) || DataType.DOUBLES.getValue().toString().equals(typeId) || DataType.INTS.getValue().toString().equals(typeId)) { for (int i = 0; i < list.size(); i++) { if (list.get(i).getIndex().equals(Operation.CONTAINS.getIndex()) || list.get(i).getIndex().equals(Operation.EXCLUDES.getIndex()) || list.get(i).getIndex().equals(Operation.NULL.getIndex()) || list.get(i).getIndex().equals(Operation.NOTNULL.getIndex())){ operationList.add(list.get(i)); } } //其他类型为所有操作符 } else { operationList = list; } return RuleAssembler.toDrlOperationDtos(operationList); }
一堆if else看着就头疼,那么改成状态模式怎么做呢?
代码如下:
1.Context类
public class DrlOperatorContext { private DrlOperatorState state; private List<Operation> operationList = new ArrayList<>(); public List<Operation> getOperationList(){ return operationList; } public List<Operation> addOperateList(String typeId) { List<Operation> list = Operation.list; //字符串类型(等于,不等于,被包含于,不被包含于,不为空,为空,匹配,不匹配) if (DataType.STR.getValue().toString().equals(typeId)) { state = new DrlStrOperator(); //数值类型(等于,大于,大于等于,小于,小于等于,不等于,被包含于,不被包含于,不为空,为空) } else if (DataType.INT.getValue().toString().equals(typeId) || DataType.FLOAT.getValue().toString().equals(typeId) || DataType.DOUBLE.getValue().toString().equals(typeId)) { state = new DrlNumberOperator(); //布尔类型(等于,不等于,不为空,为空) } else if (DataType.BOOLEAN.getValue().toString().equals(typeId)) { state = new DrlBooleanOperator(); //数组类型(包含,不包含,不为空,为空) } else if (DataType.STRS.getValue().toString().equals(typeId) || DataType.DOUBLES.getValue().toString().equals(typeId) || DataType.INTS.getValue().toString().equals(typeId)) { state = new DrlArrayOperator(); //其他类型为所有操作符 } else { operationList = list; } if (state != null) { operationList = state.addOperateList(list, this); } return operationList; } }
2.State接口
public interface DrlOperatorState { List<Operation> addOperateList(List<Operation> list, DrlOperatorContext context); }
3.具体状态
public class DrlArrayOperator implements DrlOperatorState { @Override public List<Operation> addOperateList(List<Operation> list, DrlOperatorContext context) { List<Operation> operationList = context.getOperationList(); for (int i = 0; i < list.size(); i++) { if (list.get(i).getIndex().equals(Operation.CONTAINS.getIndex()) || list.get(i).getIndex().equals(Operation.EXCLUDES.getIndex()) || list.get(i).getIndex().equals(Operation.NULL.getIndex()) || list.get(i).getIndex().equals(Operation.NOTNULL.getIndex())){ operationList.add(list.get(i)); } } return operationList; } } public class DrlBooleanOperator implements DrlOperatorState{ @Override public List<Operation> addOperateList(List<Operation> list, DrlOperatorContext context) { List<Operation> operationList = context.getOperationList(); for (int i = 0; i < list.size(); i++) { if (list.get(i).getIndex().equals(Operation.EQL.getIndex()) || list.get(i).getIndex().equals(Operation.NEQL.getIndex()) || list.get(i).getIndex().equals(Operation.NULL.getIndex()) || list.get(i).getIndex().equals(Operation.NOTNULL.getIndex())){ operationList.add(list.get(i)); } } return operationList; } } public class DrlNumberOperator implements DrlOperatorState { @Override public List<Operation> addOperateList(List<Operation> list, DrlOperatorContext context) { List<Operation> operationList = context.getOperationList(); for (int i = 0; i < list.size(); i++) { if (!list.get(i).getIndex().equals(Operation.MATCHES.getIndex()) && !list.get(i).getIndex().equals(Operation.NMATCHES.getIndex()) && !list.get(i).getIndex().equals(Operation.BET.getIndex()) && !list.get(i).getIndex().equals(Operation.CONTAINS.getIndex()) && !list.get(i).getIndex().equals(Operation.EXCLUDES.getIndex())){ operationList.add(list.get(i)); } } return operationList; } } public class DrlStrOperator implements DrlOperatorState { @Override public List<Operation> addOperateList(List<Operation> list, DrlOperatorContext context) { List<Operation> operationList = context.getOperationList(); for (int i = 0; i < list.size(); i++) { if (!list.get(i).getIndex().equals(Operation.GRE.getIndex()) && !list.get(i).getIndex().equals(Operation.GREEQL.getIndex()) && !list.get(i).getIndex().equals(Operation.LESS.getIndex()) && !list.get(i).getIndex().equals(Operation.LESSEQL.getIndex()) && !list.get(i).getIndex().equals(Operation.BET.getIndex()) && !list.get(i).getIndex().equals(Operation.CONTAINS.getIndex()) && !list.get(i).getIndex().equals(Operation.EXCLUDES.getIndex())) { operationList.add(list.get(i)); } } return operationList; } }
4.客户端调用
@Override public List<DrlTypeDTO> getDrlOperationDTO(String typeId) { DrlOperatorContext context = new DrlOperatorContext(); List<Operation> operationList = context.addOperateList(typeId); return RuleAssembler.toDrlOperationDtos(operationList); }
这样大大简化了,客户端的调用方式,提高了代码的也读性,同时需要增加新的类型只需要实现State接口即可。
相关推荐
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。
java常用设计模式-状态模式
在实际的软件开发中,状态模式并不是很常用,但是在能够用到的场景里,它可以发挥很大的作用。不过,状态机的实现方式有多种,除了状态模式,比较常用的还有分支逻辑法和查
状态模式的示例代码和文档,学习状态模式的参考资料。
最近在一个项目中用到了状态模式的相关知识,就寻找了一些资料学习了一下。该资源包含了状态模式的一个总结,同时还有两个实例的实现,分别是大小写状态转换和一个有四个状态的状态图的例子的实现 大家可以导入直接...
本人项目上经常用到的设计模式 1、工厂模式 2、观察者模式 3、状态模式 4、缓冲区模式 后续持续增加
设计模式之:状态模式,代码详解和实例分析 常用设计模式代码分析,代码实例
以JAVA为例,汇总了十几种常用的设计模式,包括了:单例模式、工厂模式、建造者模式、适配器模式、装饰器模式、外观模式、命令模式、观察者模式、状态模式、策略模式、模板方法模式等。仅供学习使用。 相关文章请看...
(在状态模式中, 还会用到状态图,这种图的使用对于理解状态的转换非常直观) 为了让大家能读懂UML图,在最前面会有一篇文章来介绍UML图形符号; 在系统的学习设计模式之后,我们需要达到3个层次: 能在白纸上画...
状态模式是GoF23个模式中最常用的之一,这篇小文不打算涉及方方面面的内容,只想在状态模式的高效运用方面谈一下自己的心得体会。 状态模式是用来设计状态机的,因此下面的叙述中将它们等同理解。有关状态机...
下面介绍几种常用的设计模式,包括单例模式、工厂模式、观察者模式、建造者模式、原型模式、适配器模式、桥接模式、组合模式、装饰器模式、外观模式、享元模式和策略模式。 单例模式(Singleton Pattern) 单例模式...
设计模式:(常用23种-----像内功心法) 1. 设计模式不是一个知识点 2. 设计模式是一种设计经验的总结 3. 设计模式是用来解决某些场景下的某一类问题-------... 命令模式、状态模式、备忘录模式、访问者模式、中介者模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括 架构模式...(在状态模式中, 还会用到状态图,这种图的使用对于理解状态的转换非常直观)
java之23中常用设计模式详解 总体来说设计模式分为三...行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
状态模式 导入模式 迭代器模式 命令模式 职责链模式 进来者模式 访问者模式 数据结构 Stack - 使用泛型实现Stack 生成斐波那契数列 使用容器 利用迭代器实现原材料 实用程序 StringUtil类 - 封装常用的String方法 ...
第10章 状态模式 用来创建一个状态机器的设计模式 状态设计模式用到的主要(30P概念 最小抽象状态设计模式 视频播放器具体状态应用程序 扩展状态设计:添加状态 添加更多的状态和流媒体播放能力 小结 第11章 ...
bfe 手工应急模式设置 clear 复位功能 clock 管理系统时钟 configure 进入设置模式 connect 打开一个终端 copy 从tftp服务器拷贝设置文件或把设置文件拷贝到tftp服务器上 debug 调试功能 disable 退出优先...
2,观察者模式:定义了对象之间的以对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 3,装饰者模式:动态地将责任附加到对象上。若要扩展功能。装饰着提供 了比继承更有弹性的...
在Android开发过程中,很多时候都会用到当前网络的状态判断以及网络状况发生变化的时候做出相应的反应,要想监听网络状态,用观察者模式再合适不过了,废话不多说,直接上代码。 观察者模式属于面向对象的23中设计...
内容包括设计模式概述、面向对象设计原则、简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式、单例模式、适配器模式、桥接模式...录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式...