状态模式涉及到的类有:
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接口即可。
相关推荐
ARM架构作为嵌入式系统中常用的处理器架构,具备独特的两种工作状态和七种工作模式,这些状态和模式的设计使得ARM处理器能够高效地处理各种任务。 首先,ARM架构支持两种工作状态:ARM状态和Thumb状态。ARM状态是指...
今天,我们将讨论两种常用的Java设计模式:状态模式和模板模式。 状态模式(State Pattern) --------------------- 状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将状态封装...
状态模式定义了一个对象中的行为,这些行为基于该对象的状态。当对象的状态改变时,其行为也会相应地更新。这种模式将与特定状态相关的行为封装在单独的类中,使得对象可以在运行时改变其行为。 2. **组成部分**:...
状态模式的优势在于它将状态相关的操作封装在各自的状态类中,使得代码结构清晰,易于扩展。每个状态类只关注自己负责的行为,符合开闭原则。但它的缺点是如果状态过多,可能会导致类的数量增加,增加系统的复杂性。...
行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。
在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是引用一个共同的接口来指向新创建的对象。这有助于减少代码的耦合性。 3. **建造者模式**:建造者模式是另一种创建型设计模式,它允许我们分步骤...
最近在一个项目中用到了状态模式的相关知识,就寻找了一些资料学习了一下。该资源包含了状态模式的一个总结,同时还有两个实例的实现,分别是大小写状态转换和一个有四个状态的状态图的例子的实现 大家可以导入直接...
以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...
状态模式允许对象在内部状态改变时改变其行为,使对象看起来好像改变了它的类。它将状态的行为封装在独立的类中,使得可以添加新的状态而不会影响现有代码。 4. 缓冲区模式: 缓冲区模式(并非标准设计模式,可能...
在UML表示中,每种模式都会用到不同的图来展示其关键概念。例如,单例模式通常会用到类图来表示只有一个实例的类及其静态方法;工厂方法模式可能会包含一个抽象工厂类和多个具体实现类;而观察者模式会展示一个主题...
在工厂模式中,当客户端请求创建一个产品对象时,工厂类会返回一个产品对象,而无需知道具体的实现类。这有助于解耦代码,使系统更易于扩展。 **策略模式**属于行为设计模式,它定义了一系列算法,并将每个算法封装...
3. **行为型设计模式**:涉及职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。职责链模式让多个对象有机会处理请求,避免请求...
在此模式下,CPU暂停工作,仅保留必要的外围设备保持活动状态。 - **触发条件**:可以通过特定的指令或者中断事件将单片机置于休眠状态。 - **应用场景**:适合于需要长时间等待外部触发信号的应用场景,如传感器...
行为型模式涉及对象之间的通信,描述了对象之间如何相互协作完成单个对象无法独立完成的任务,常见的行为型模式有八种:模板方法模式、观察者模式、状态模式、职责链模式、命令模式、访问者模式、策略模式和备忘录...
本篇文章将基于“常用设计模式及Java程序”这一主题,深入探讨设计模式的基本概念、应用案例及其在Java编程中的实现。 #### 设计模式的基础 设计模式主要解决了软件开发过程中反复出现的问题。根据Christopher ...
这里提到的"9种常用设计模式收集"涵盖了Java Web开发和Android开发中的一些核心设计原则,通过深入理解并应用这些模式,开发者可以提高代码的可读性、可维护性和可扩展性。 1. **单例模式**:单例模式确保一个类...
18. **State(状态模式)** - **定义**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 - **目的**:封装对象的行为转换。 - **优点**: - 封装了转换规则。 - 将不同状态的行为...
胡长城(银狐999)在他的文章《工作流回退常用模式分析》中深入探讨了工作流回退的各种模式,这些模式反映了在不同场景下如何有效管理流程的回退。以下是对该文中提到的几种关键回退模式的详细解释: ### 1. 前言 ...
以下是关于标题和描述中提到的Java常用设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂方法实现。双检锁(Double-Check Locking)...
- 状态模式(State):允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 - 策略模式(Strategy):定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。 - 模板方法模式...