`
men4661273
  • 浏览: 278635 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java设计模式-State(状态)模式

    博客分类:
  • java
阅读更多
    state定义
    不同的状态,不同的行为;或者说,每个状态有着相应的行为.
   
    就像电风扇的开关,一档的上一个是关闭,关闭的上一个是五档,五档的上一个是四档,以此类推,而且五档的下一个是关闭,关闭的下一个是一档。那么在实际应用中,我们可能会这样做:
     在上一档的方法中:
if(level == 5){
	level = 4;
do something();
}else if(level == 4){
	level = 3;
do something();

} else if (level == 3){
	level == 2;
do something();

}


    在下一档的方法中:
if(level == 1){
	level = 2;
do something();

}else if(level == 2){
	level = 3;
do something();

} else if (level == 3){
	level == 4;
do something();

}


    单一方向的切换还好点,双方向的切换就可以考虑使用state模式了

     假设现在有一个开关,控制三种颜色的切换,blue,green,red,蓝色下一个绿色,绿色下一个红色,红色下一个是蓝色,也可以倒过来

代码如下:
package state;

/*
 * 状态操作接口,执行上一个下一个的操作,还可以获得当前的状态
 * 当然在这可以既执行别的操作,比如开关拨到某个颜色的时候,颜色对应的灯亮
 */

public interface State {

	public  void last(Context c);

	public  void next(Context c);
	
	public  String getState();


}



package state;

/*
 * 蓝色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中
 * 设置改变后的状态
 */
public class BlueState implements State {

	public String getState() {
		// TODO Auto-generated method stub
		return "blue";
	}

	public void last(Context c) {
		c.setState(new GreenState());

	}

	public void next(Context c) {
		c.setState(new RedState());

	}

}


package state;

/*
 * 绿色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中
 * 设置改变后的状态
 */
public class GreenState implements State {

	public String getState() {
		
		return "green";
	}

	public void last(Context c) {
		c.setState(new RedState());

	}

	public void next(Context c) {
	c.setState(new BlueState());

	}

}


  package state;
 /*
  * 红色状态类,实现的接口的方法,通过状态管理器在上一个或者下一个方法中
  * 设置改变后的状态
  */
  public class RedState implements State {

	public String getState() {
		return "red";
	}

	public void last(Context c) {
	c.setState(new BlueState());

	}

	public void next(Context c) {
		c.setState(new GreenState());

	}

}



package state;

/*
 * 状态管理器,设置初始状态,得到当前状态,
 * 提供了两个操作,上一个的操作方法中,调用了当前状态的last方法,将状态管理器的状态更新
 *                下一个的操作方法中,调用了当前状态的next方法,将状态管理器的状态更新
 */
public class Context {
	
	private State state = null;

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}
	
	public void push(){
		
		state.last(this);
		System.out.println(state.getState());
	}
	
	public void pull(){
		
		state.next(this);
		System.out.println(state.getState());
	}
	

}


package state;
/*
 * 测试类
 */
public class Test {

	public static void main(String[] args) throws InterruptedException {
		/*
		 * 创建一个状态管理器,设置初始状态为红色,
		 * 然后就可以执行状态管理器的last或者next方法
		 */
		Context c = new Context();
		State redsState = new RedState();		
		c.setState(redsState);
			while (true){
				System.out.println("当前状态:"+c.getState().getState());
				System.out.print("上一个状态: ");
				 c.push();
				 Thread.currentThread().sleep(2000);
			}		 
	}
	
}





    缺点也显而易见了,如果状态太多了,对应的状态类也会比较多的。。


  • 大小: 15.1 KB
  • 大小: 29 KB
1
4
分享到:
评论
6 楼 a123159521 2012-08-17  
状态模式,让我想到多线程中的信号量,比哪信号量变了,[1,2,3,4,5]每一个信号量执行一个操作
5 楼 men4661273 2012-08-17  
yuye_zhai 写道
在这个场景中 GreenState 这些类是不是应该用单例


嗯,谢谢指出,确实要用单例,否则会出来多少对象,
4 楼 yuye_zhai 2012-08-17  
在这个场景中 GreenState 这些类是不是应该用单例
3 楼 men4661273 2012-08-17  
zui4yi1 写道
状态可不可以写为一个数值??
next()的时候+1,last()的时候-1?


可以的呀,方法里面做任何操作都可以的,比如电风扇的上一档的时候,执行一个操作,使风速变小,下一档的时候,使风速大,空挡的时候停止
2 楼 zui4yi1 2012-08-16  
状态可不可以写为一个数值??
next()的时候+1,last()的时候-1?
1 楼 解未知数 2012-08-16  
坐等高手评论...

相关推荐

    java-设计模式-状态模式-模拟审批流程-二级审批 完整代码

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在这个示例中,我们关注的是如何使用Java实现一个审批流程,特别是涉及二级审批的场景。这个压缩包文件包含了一个...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    java 设计模式之状态模式

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,看起来好像对象改变了它的类。在Java中,状态模式通常通过定义不同的状态类和一个上下文类来实现,其中上下文类持有状态对象并调用其方法来响应...

    java设计模式之-状态模式-实现

    在Java设计模式中,状态模式的核心概念包括以下几个部分: 1. **状态(State)**:这是个接口或抽象类,定义了状态对象的公共行为。每个状态都对应一个特定的操作集,这些操作可能会影响对象的状态。 2. **具体...

    JAVA设计模式-chm版

    这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的解决方案的标准化描述,它们在软件工程中起到了重要的作用,帮助开发者创建可维护、可扩展且易于理解...

    java设计模式-状态

    状态模式是一种行为设计模式,它允许对象在内部状态改变时改变其行为,对象看起来似乎修改了它的类。在Java中,这种模式常用于处理对象在不同状态下的多种行为,使得代码更加灵活,易于维护和扩展。 状态模式的核心...

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

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

    Java设计模式-备忘录

    **Java设计模式——备忘录模式详解** 备忘录模式是一种行为设计模式,它允许对象在不破坏封装性的前提下捕获并存储其内部状态,以便稍后恢复到该状态。这种模式常用于在游戏中保存进度、撤销/重做操作、以及在复杂...

    JAVA设计模式--入门

    8. 状态模式(State):允许对象在其内部状态改变时改变其行为。 9. 策略模式(Strategy):定义一系列算法,并将每个算法封装起来,使它们可以相互替换。 10. 模板方法模式(Template Method):定义一个操作中的...

    java设计模式----源代码

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决问题的经验总结,可以提高代码的可读性、可维护性和可扩展性。本压缩包包含的源代码涵盖了多个经典的设计模式,接下来将对这些模式进行详细介绍。 1....

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

    在《设计模式》实战---状态模式(State Pattern)这篇文章中,作者可能详细探讨了以下关键点: 1. **模式定义**:状态模式允许对象在内部状态改变时改变其行为,对象看起来好像修改了它的类。这通过将每个状态封装...

    java设计模式-备忘录模式

    Java设计模式中的备忘录模式(Memento Pattern)是一种用于保存对象状态的模式,以便在未来某一时刻能够恢复到之前的状态。这种模式的核心在于在不违反对象封装性的前提下,捕获对象的内部状态并将其存储起来。备忘...

    《Java设计模式》课后答案-刘伟.rar

    《Java设计模式》是刘伟教授的一本关于设计模式的教材,主要面向高等学校的学生和对Java编程有深入兴趣的开发者。设计模式是软件工程中的一种重要思想,它封装了在特定场景下的问题解决方案,可以提高代码的可读性、...

    JAVA design pattern-java设计模式

    Java设计模式是软件工程中的一种最佳实践,它提供了一种在特定情况下解决常见问题的标准化方法。设计模式不是具体的代码或库,而是一种通用解决方案的描述,可以应用于各种编程语言,包括Java。在这个名为"JAVA ...

    试谈java设计模式之State.docx

    Java 设计模式之 State 模式 State 模式是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。该模式的主要思想是将对象的状态和行为分离,使用不同的状态子类来实现不同的行为。 何时使用 State 模式...

    试谈java设计模式之State.pdf

    State 模式是 Java 设计模式的一种,用于解决状态切换问题。当对象的状态改变时,对象的行为也随之改变。State 模式将状态和行为分离,实现了状态切换的灵活性和可扩展性。 定义:State 模式的定义是:不同的状态,...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    17. **状态模式(State Pattern)**:允许对象在其内部状态改变时改变其行为,对象看起来似乎改变了它的类。 18. **访问者模式(Visitor Pattern)**:在不改变类的前提下,增加新的操作行为,使得访问者可以作用于...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    Java设计模式是软件工程中的一种最佳实践,它总结了在特定场景下解决常见问题的经验,为程序员提供了可重用的解决方案。本资料“《java设计模式》课后习题模拟试题解答——刘伟.zip”主要涵盖了Java设计模式的学习与...

    设计模式-状态模式.pdf

    状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为,从而使对象看起来像改变了其类。这种模式的主要目的是将对象的状态作为独立的类来管理,从而简化了条件逻辑并提高了代码的...

Global site tag (gtag.js) - Google Analytics