`
airu
  • 浏览: 267460 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

每天一个(设计模式)--状态(State)模式

 
阅读更多
UML中有个图叫状态图,描述了对象的状态。
一般来说,对于有状态的对象,在处理动作时,会根据不同的状态得到不同的行为结果。
比如说,一扇旋转门,我们推,如果是关闭的,那么他就打开,如果我们再推,他就关闭。

State设计模式,通过把状态封装,通过接口隔离,使得我们不需要用if else等语句硬编码。缺点是如果状态过多,那么将会有很多的状态类。
状态模式的UML如下图所示:



下面通过一个开关程序来说明状态模式。
这个开光类似遥控器上的开机,关机,当机器是开的状态时,他执行关闭,当机器是关闭的状态时,他执行打开动作。

电视类(一个可以拥有状态的类,可以实现一个 Stateable接口,不过这样在这里设计过度了)

public class Television {
	TelState state;
	
	public Television(){
		state = new TelCloseState();
	}
	
	public void setState(TelState state){
		this.state = state;
	}
	
	public TelState getState(){
		return this.state;
	}


遥控器,这其实是个调用者类。这里不停的按开关按钮。
public class Controller {
	Television television;
	public Controller(){
		television = new Television();
	}
	public void clickButton(){
		television.getState().change(television);
	}
	
	public static void main(String[] arg){
		Controller controller = new Controller();
		controller.clickButton();
		controller.clickButton();
		controller.clickButton();
		controller.clickButton();
	}
}


下面是关键的状态接口。接口中的Television其实最好为一个接口,Stateable接口。
public interface TelState {
	public void change(Television tel);
}


下面是具体的状态。对于Off状态的电视,改变后就是开(On)。
public class TelOffState implements TelState {

	@Override
	public void change(Television tel) {
		// TODO Auto-generated method stub
		
		System.out.println("Televison On!");
		tel.setState(new TelOnState());
	}

}


对于On状态的电视,改变后就是关(Off)
public class TelOnState implements TelState {

	@Override
	public void change(Television tel) {
		
		// TODO Auto-generated method stub
		System.out.println("Televison Close!");
		tel.setState(new TelCloseState());
	}

}


来看下运行结果:

Televison On!
Televison Close!
Televison On!
Televison Close!


这就是一个简单的状态机了。点击遥控器的行为,在不同状态,有不同的功能作用。

状态模式运用在一些具有状态的对象上。
  • 大小: 11.9 KB
分享到:
评论

相关推荐

    c++设计模式-行为型模式-状态模式

    c++设计模式-行为型模式-状态模式;qt工程;c++简单源码; 状态(State)模式的定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。

    设计模式C++学习之状态模式(State)

    设计模式C++学习之状态模式(State)

    《设计模式》实战---状态模式(State Pattern)

    NULL 博文链接:https://zhangyan19870108.iteye.com/blog/1992409

    haoyGo#weekly-1#186.精读《设计模式 - State 状态模式》1

    重点在 “内部状态” 的理解,也就是状态改变是由对象内部触发的,而不是外部,所以 外部根本无需关心对象是否用了状态模式,拿数据库连接器的例子来说,不管这个类是用

    设计模式--C++

    5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型模式 208 5.10 TEMPLATE METHOD(模板方法)—类行为型模式 214 5.11 VISITOR(访问者)—对象行为型模式 218 5.12 行为模式的讨论 228 ...

    设计模式State模式源码

    State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取...上传文件时一个自己写的State模式的源码实例。

    设计模式之状态模式(State)

    状态模式(State) 用意:允许一个对象当状态改变时,改变其行为。

    设计模式 - 状态模式(C++实例)

    分享关于状态模式的c++实现,若理解有误,还请指正。

    C++ State 设计模式 演示源代码

    http://blog.csdn.net/feiyinzilgd/archive/2011/04/05/6302717.aspx (C++ State 设计模式博客)演示源代码。用C++实现并较详细的讲述了Sate模式的意图和工作状态。

    设计模式--可复用面向对象软件的基础

    第二章 实例研究:设计一个文档编辑器 2.1 设计问题 2.2 文档结构 2.3 格式化 2.4 修饰用户界面 2.5 支持多种视感标准 2.6 支持多种窗口系统 2.7 用户操作 2.8 拼写检查和断字处理 2.9 小结 第三章 创建型模式 3.1 ...

    C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式

    C#面向对象设计模式纵横谈(22):(行为型模式) State 状态模式

    研磨设计模式-part2

    如果你想要深入透彻地理解和掌握设计模式,并期望能真正把设计模式应用到项目中去,那么这是你不可错过的一本好书。 《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。...

    研磨设计模式-part4

    如果你想要深入透彻地理解和掌握设计模式,并期望能真正把设计模式应用到项目中去,那么这是你不可错过的一本好书。 《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。...

    研磨设计模式-part3

    如果你想要深入透彻地理解和掌握设计模式,并期望能真正把设计模式应用到项目中去,那么这是你不可错过的一本好书。 《研磨设计模式》难度为初级到中级,适合与所有开发人员、设计人员或者即将成为开发人员的朋友。...

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    Head First 设计模式 (十) 状态模式(State pattern) C++实现

    状态模式 State Pattern

    在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。...在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

    设计模式之状态模式State

    NULL 博文链接:https://wy649898543.iteye.com/blog/1434590

    设计模式:可复用面向对象软件的基础--详细书签版

    作者从多年的面向对象设计经验中精选了23个模式,这构成了该书的精华部份,每一个精益求精的优秀程序员都应拥有这本《设计模式》。”--larry o'brien, software development    “[设计模式]在实用环境下特别有用,...

    C++设计模式课件18_State_状态模式.pdf

    C++设计模式课件18_State_状态模式.pdf

Global site tag (gtag.js) - Google Analytics