三分钟理解“状态模式”——设计模式轻松掌握

什么是状态模式?

一个函数原本有很多判断语句,现在把判断语句中的每一种状态封装成一个类,每一个状态类中均有一个handle()函数,该函数能对当前状态做出处理,并且能指明不能处理时的下一个状态类。

状态模式的类图

1.将一个原本的判断结构封装成一个个状态类,每个状态类都有函数handle(Context);

该函数对本状态作出处理,当无法处理时,将context肚子中的成员变量state改成能处理的那个状态类的对象,并执行context的request()函数;

handle()函数实现如下:

public void handle(Context Context){
	//判断是否能处理
	if(本类能处理){
		进行处理;
	}

	//本类不能处理时
	else{
		//将context的state变量设为能处理状态类的对象
		context.setState(new ConcreteStateB());

		//执行context中的request,让下一个状态类处理
		context.request();
	}
}

2.创建一个Context类,它是提供给客户端执行整个状态模式的接口;

Context类中含有State类型的成员变量state,还有一个handle()函数,该函数用于执行state中的request()函数。

class Context(){
	private State state;

	public void request(){
		this.state.handle();
	}
}

3.当客户端调用context的request()函数时,request调用当前context肚子里的那个state的handle函数,如果能处理就处理掉,如果不能处理就将context的state设为能处理的那个状态类,然后再调用request函数。

然后新的处理函数又被执行,直到遇到能执行的处理类为止。

状态模式与职责链模式的异同?

PS:职责链模式的详细介绍请移步至:http://blog.csdn.net/u010425776/article/details/48037939

相同点:状态模式和职责链模式都是将判断语句中的每一个判断分支封装成一个个类。

不同点:状态模式中,每个状态类中既包含了符合条件时的处理方法,也在不符合条件时指明下一个状态类,然后执行该状态类中的处理函数;而在职责链模式中,每一个处理类的处理函数中只有处理当前状态的方法,若不能处理时下一个处理类是由客户端指定的。

综上所述:状态模式的判断流程是在低层模块中定义好的,职责链模式的处理流程是让用户自己设置的。

状态模式的好处

1.遵循了“单一职责原则”:状态模式把一个复杂的判断结构拆分成一个个拥有先后关系的状态类,从而缩小了原本含有大量判断代码的那个函数的体积;原本这个函数中因为有大量的判断导致这个函数责任过大,而现在这个函数的功能不变,但只有一个Context类,从而职责就小了很多。

2.遵循了“开放-封闭原则”:如果此时需要增加判断分支,只要增加一个新的State子类即可,无需像原来那样修改判断语句的代码。

PS:我们要避免函数过长的现象。因为一个函数过长说明这个函数中职责太多,违背了单一职责原则;我们尽量要把长函数分解成一个个小函数,每个小函数只做一件事。

何时使用状态模式?

当一个函数中判断分支很多时,就需要使用状态模式。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闪电gogogo的专栏

Python初学——多进程Multiprocessing

1.1 什么是 Multiprocessing 多线程在同一时间只能处理一个任务。 可把任务平均分配给每个核,而每个核具有自己的运算空间。 1.2 添加进程 P...

3198
来自专栏积累沉淀

死锁

什么是死锁: 是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死...

1979
来自专栏数值分析与有限元编程

Fortran知识|代码错误(input conversion error)

如图所示,提示:input conversion error ? 此时遇到了异常的转换错误。可能是输入数据类型与程序所声明变量类型不一致(比如输入2.5,对应变...

4006
来自专栏破晓之歌

python中的内置函数(双下划线) 原

如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import...

2522
来自专栏行者常至

(05)Struts2_Action概述

641
来自专栏爱撒谎的男孩

多线程的使用

1605
来自专栏python3

python列表

"C:Program Files (x86)python3.6python.exe" D:/python3_study/list1.py

723
来自专栏程序员的SOD蜜

实例探究字符编码:unicode,utf-8,default,gb2312 的区别

 最近做邮件收发,不同的邮件系统间可能会出现编码问题,迫使我重新回来研究一下字符的编码问题,unicode,utf-8,gb2312这些编码格式都是我们熟知的,...

22510
来自专栏阮一峰的网络日志

JavaScript 的 this 原理

1976
来自专栏java一日一条

Java虚拟机体系结构,你知道吗?

众所周知,Java支持平台无关性、安全性和网络移动性。而Java平台由Java虚拟机和Java核心类所构成,它为纯Java程序提供了统一的编程接口,而不管下层操...

652

扫码关注云+社区