`

工作中用到的状态模式

 
阅读更多

状态模式涉及到的类有:

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接口即可。

  • 大小: 8 KB
分享到:
评论

相关推荐

    ARM的2种工作状态和7种工作模式

    ARM架构作为嵌入式系统中常用的处理器架构,具备独特的两种工作状态和七种工作模式,这些状态和模式的设计使得ARM处理器能够高效地处理各种任务。 首先,ARM架构支持两种工作状态:ARM状态和Thumb状态。ARM状态是指...

    java常用设计模式-状态模式

    今天,我们将讨论两种常用的Java设计模式:状态模式和模板模式。 状态模式(State Pattern) --------------------- 状态模式是一种行为型设计模式,它允许对象在内部状态改变时改变它的行为。状态模式将状态封装...

    状态模式代码示例

    状态模式定义了一个对象中的行为,这些行为基于该对象的状态。当对象的状态改变时,其行为也会相应地更新。这种模式将与特定状态相关的行为封装在单独的类中,使得对象可以在运行时改变其行为。 2. **组成部分**:...

    64丨状态模式:游戏、工作流引擎中常用的状态机是如何实现的?1

    状态模式的优势在于它将状态相关的操作封装在各自的状态类中,使得代码结构清晰,易于扩展。每个状态类只关注自己负责的行为,符合开闭原则。但它的缺点是如果状态过多,可能会导致类的数量增加,增加系统的复杂性。...

    java常用23中设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。

    java中常用设计模式总结心得

    在工厂模式中,当创建对象时,我们不会对客户端暴露创建逻辑,而是引用一个共同的接口来指向新创建的对象。这有助于减少代码的耦合性。 3. **建造者模式**:建造者模式是另一种创建型设计模式,它允许我们分步骤...

    状态模式及具体实现

    最近在一个项目中用到了状态模式的相关知识,就寻找了一些资料学习了一下。该资源包含了状态模式的一个总结,同时还有两个实例的实现,分别是大小写状态转换和一个有四个状态的状态图的例子的实现 大家可以导入直接...

    c#几种常用的设计模式

    以下是对标题和描述中提到的几种常用C#设计模式的详细解释: 1. **单例模式(Singleton)**: - 单例模式确保一个类只有一个实例,并提供全局访问点。在C#中,通常通过私有化构造函数和静态成员来实现。这样可以...

    工作中常用的设计模式总结

    状态模式允许对象在内部状态改变时改变其行为,使对象看起来好像改变了它的类。它将状态的行为封装在独立的类中,使得可以添加新的状态而不会影响现有代码。 4. 缓冲区模式: 缓冲区模式(并非标准设计模式,可能...

    23常用设计模式的UML

    在UML表示中,每种模式都会用到不同的图来展示其关键概念。例如,单例模式通常会用到类图来表示只有一个实例的类及其静态方法;工厂方法模式可能会包含一个抽象工厂类和多个具体实现类;而观察者模式会展示一个主题...

    Jjava常用设计模式

    在工厂模式中,当客户端请求创建一个产品对象时,工厂类会返回一个产品对象,而无需知道具体的实现类。这有助于解耦代码,使系统更易于扩展。 **策略模式**属于行为设计模式,它定义了一系列算法,并将每个算法封装...

    JAVA23个常用设计模式(ppt下载)

    3. **行为型设计模式**:涉及职责链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、模板方法模式和访问者模式。职责链模式让多个对象有机会处理请求,避免请求...

    AVR单片机的工作状态

    在此模式下,CPU暂停工作,仅保留必要的外围设备保持活动状态。 - **触发条件**:可以通过特定的指令或者中断事件将单片机置于休眠状态。 - **应用场景**:适合于需要长时间等待外部触发信号的应用场景,如传感器...

    常用的设计模式

    行为型模式涉及对象之间的通信,描述了对象之间如何相互协作完成单个对象无法独立完成的任务,常见的行为型模式有八种:模板方法模式、观察者模式、状态模式、职责链模式、命令模式、访问者模式、策略模式和备忘录...

    常用设计模式及Java程序 pdf

    本篇文章将基于“常用设计模式及Java程序”这一主题,深入探讨设计模式的基本概念、应用案例及其在Java编程中的实现。 #### 设计模式的基础 设计模式主要解决了软件开发过程中反复出现的问题。根据Christopher ...

    9种常用设计模式收集

    这里提到的"9种常用设计模式收集"涵盖了Java Web开发和Android开发中的一些核心设计原则,通过深入理解并应用这些模式,开发者可以提高代码的可读性、可维护性和可扩展性。 1. **单例模式**:单例模式确保一个类...

    .NET 23种常用设计模式

    18. **State(状态模式)** - **定义**:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 - **目的**:封装对象的行为转换。 - **优点**: - 封装了转换规则。 - 将不同状态的行为...

    工作流回退常用模式分析

    胡长城(银狐999)在他的文章《工作流回退常用模式分析》中深入探讨了工作流回退的各种模式,这些模式反映了在不同场景下如何有效管理流程的回退。以下是对该文中提到的几种关键回退模式的详细解释: ### 1. 前言 ...

    Java常用设计模式

    以下是关于标题和描述中提到的Java常用设计模式的详细解释: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。在Java中,通常通过私有构造器和静态工厂方法实现。双检锁(Double-Check Locking)...

    java几种常用的设计模式源码和心得

    - 状态模式(State):允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。 - 策略模式(Strategy):定义一系列的算法,并将每一个算法封装起来,使它们可以互相替换。 - 模板方法模式...

Global site tag (gtag.js) - Google Analytics