专栏首页大闲人柴毛毛三分钟理解“状态模式”——设计模式轻松掌握

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

什么是状态模式?

一个函数原本有很多判断语句,现在把判断语句中的每一种状态封装成一个类,每一个状态类中均有一个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 条评论
登录 后参与评论

相关文章

  • JavaScript奇淫技巧(一)

    if-else简化写法 代码中若出现多层if-else嵌套,代码就会显得臃肿不堪,这时可采用替代方案来浓缩代码。 常规写法:(臃肿不堪) if(){ ...

    大闲人柴毛毛
  • 剑指offer代码解析——面试题14调整数组顺序使奇数在偶数之前

    本题详细解析都已在代码中注释了: /** * 题目:输入一个数组,要求将奇数放在数组的前半段,偶数放在数组的后半段 * @author 大闲人柴毛毛 *...

    大闲人柴毛毛
  • 稳扎稳打JS——this

    this的值是在运行时确定的 JS中的this究竟代表什么,这是在程序运行时根据上下文环境确定,可以分为以下几种情况。 1. 全局作用域中的this 在全局作...

    大闲人柴毛毛
  • 《JavaScript 模式》读书笔记(4)— 函数5

    这部分我们主要讨论Curry化和部分函数应用的内容。但是在深入讨论之前,我们需要先了解一下函数应用的含义。

    zaking
  • 【Python编程导论】第四章- 函数、作用域与抽象

    (3) 函数名后面括号中的一系列名称是函数的形式参数。使用函数时,形式参数在函数调用时被绑定(和赋值语句一样)到实际参数(通常指代函数调用时的参数)。

    Datawhale
  • 从零开始深度学习(三):逻辑回归

    文章首发于本人CSDN账号:https://blog.csdn.net/tefuirnever

    我是管小亮
  • 《Kotin 极简教程》第8章 函数式编程(FP)(1)第8章 函数式编程(FP)《Kotlin极简教程》正式上架:

    "函数式编程", 又称泛函编程, 是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。它的基础是 λ 演算(lambda...

    一个会写诗的程序员
  • 英特尔Movidius神经元计算棒(NCS)基于ROS的实现与封装

    如今,人工智能的热潮正在席卷各行各业,而计算力和数据、算法一同支撑着人工智能的蓬勃发展。作为人工智能的一个重要分支,深度学习以其良好的表现,越来越受到业界的广泛...

    机器人网
  • 英特尔Movidius神经元计算棒(NCS)基于ROS的实现与封装

    如今,人工智能的热潮正在席卷各行各业,而计算力和数据、算法一同支撑着人工智能的蓬勃发展。作为人工智能的一个重要分支, 深度学习以其良好的表现,越来越受到业界的广...

    机器人网
  • 深度学习基础:为什么神经网络的感知机中的神经元需要偏置项?

    每个人都知道神经网络中的偏置(bias)是什么,而且从人类实现第一个感知器开始,每个人都知道神经元需要添加偏置项。但你是否考虑过我们为什么要使用偏置项呢?就我...

    deephub

扫码关注云+社区

领取腾讯云代金券