文档章节

java设计模式-状态模式

岳静
 岳静
发布于 2012/07/04 22:23
字数 798
阅读 361
收藏 7

这近在项目上用到了设计模式中的状态模式,我在这里写篇文章分享下学习经验。

状态模式给我们带来的好处和解决的一些问题:

我们让程序根据不同的外部情况来做出不同的响应,最直接的方法就是在程序中,将可能发生的外部情况全部考虑到,使用if else 语句来进行代码响应选择。但是这种方法对于复杂一点的状态判断,就会显得杂乱无章,容易产生错误、不利于维护;而且增加一个新的状态将会带来大量的修改。这个时候我们采用状态模式是个不错的选择。状态模式可以有效的替换在程序中的if else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来约束他们。如果我们需要新增一种状态,则只需要新增一种状态类就可以解决了,也省去了修改大量代码带来的麻烦。

下面列举一个java的列子:

一个篮球运动员的投篮手感状态,运动员的手感状态有[超常状态、正常状态、不好状态]

这时我们需要一个环境类,默认:这个运动员的状态是正常状态

public class Player {
	//正常发挥
	private State state = new NormalState();
	/**
	 * 设置投篮的状态
	 * @param state
	 */
	public void setState(State state){
		this.state = state;
	}
	public void shot(){
		// TODO Auto-generated method stub
		state.shot();
	}
}
然后我们需要给运动员的投篮手感状态定义一个接口,然后让各种投篮手感状态去实现这个接口。
public interface State {

	/**
	 * 公用的投篮结果方法
	 */
	public abstract void shot();
}
接下来我们就需要定义各种状态类了,这里我定义了3种状态,我只列举其中的一种了
/**
 * 投篮超常的状态
 * @author jing.yue
 * @version 1.0
 * @since 2012-07-4
 */
public class SuperState implements State {

	@Override
	public void shot() {
		// TODO Auto-generated method stub
		System.out.println("今天你投篮十中十");
	}

}

最后一步就是投篮的测试类了,如果我们不指定状态,则默认为正常状态[投篮10中5]。我们还可以调用setState方法将运动员今天投篮的状态设置进去,然后调用shot方法来查看投篮的结果。

/**
 * 投篮状态测试类
 * @author jing.yue
 * @version 1.0
 * @since 2012-07-4
 */
public class TestState {

	/**
	 * 状态模式用来处理条件判断等
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Player player = new Player();
		//正常下投篮
		player.shot();
		//不正常下投篮
		player.setState(new NonormalState());
		player.shot();
		//超常下投篮
		player.setState(new SuperState());
		player.shot();

	}
}
这就是我对状态模式理解了。有不对的地方多多指教。

本文转载自:https://www.52jingya.com/aid6.html

岳静

岳静

粉丝 45
博文 19
码字总数 8678
作品 0
深圳
高级程序员
私信 提问
加载中

评论(1)

jing——
jing——
受益匪浅,学习了
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
293
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
214
0
Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]: 大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样。但是大多数的Java代码都不是由开发J...

原创小博客
2018/07/17
31
0
Java语言编程学习之Lambda表达式设计和架构的原则

大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样。但是大多数的Java代码都不是由开发JDK的程序猿写的,而是像我们这样的普通程序猿。 很多人都...

JAVA高级架构开发
2018/08/19
0
0
为什么java中用枚举实现单例模式会更好

枚举单例是java中使用枚举提供一个实例对象来实现单例模式的一种新方法,虽然单例模式在java中早已存在,但枚举单例实际上从java5引入枚举作为它的关键特性之后相对来说还是一个新的概念,这...

zhoujy
2013/06/01
8.8K
1

没有更多内容

加载失败,请刷新页面

加载更多

iOS Xcode升级包地址(感谢大神)

下载地址:DeviceSupport

_____1____
5分钟前
2
0
Qt编写自定义控件71-圆弧进度条

一、前言 现在web形式的图表框架非常流行,国产代表就是echart,本人用过几次,三个字屌爆了来形容,非常强大,而且易用性也非常棒,还是开源免费的,使用起来不要太爽,内置的各种图表和仪表...

飞扬青云
5分钟前
1
0
润乾报表与 ActiveReport JS 功能对比

简介 润乾报表是用于报表制作的大型企业级报表软件,核心特点在于开创性地提出了非线性报表数学模型,采用了革命性的多源关联分片、不规则分组、自由格间运算、行列对称等技术,使得复杂报表...

泡泡糖儿
17分钟前
3
0
【1015】LNMP架构二

【1015】LNMP架构二 三、PHP安装 PHP安装和LAMP安装PHP方法有差别,需要开启php-fpm服务 1、下载PHP7至/usr/local/src/ 切换目录:cd /usr/local/src 2、解压缩 tar -jxvf php-7.3.0.tar.gz...

飞翔的竹蜻蜓
51分钟前
4
0
浅谈Visitor访问者模式

一、前言 什么叫访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+对其进行处理就叫作访问,那么...

青衣霓裳
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部