好记性不如铅笔头

java, 编程, 设计模式

设计模式学习笔记:状态模式

最近在看《设计模式之禅》这本书,收获良多,作者不愧是工作多年的大牛,将各种设计模式讲解的非常透彻。这里备份下书中的【 状态模式 】代码:

github:

https://github.com/cstriker1407/design_pattern 】

状态模式比较奇怪,它把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。

LiftStates.java类,主要用来管理各种状态:

//状态模式把所研究的对象的行为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时候,其行为也随之改变。
public class LiftStates
{
	public static interface ILiftState
	{
		public void open();
		public void close();
		public void run();
		public void stop();
	}
	public static final ILiftState OpenState = new LiftOpen();
	public static final ILiftState CloseState = new LiftClose();
	public static final ILiftState RunState = new LiftRun();
	public static final ILiftState StopState = new LiftStop();
	
	/* 简单起见,使用static */
	public static ILiftState currentLiftState;
	
	
	/* 简单起见,使用static
	 * 正常状态运行
	 */
	public static void normal()
	{
		currentLiftState = OpenState;
		currentLiftState.open();
		currentLiftState.close();
		currentLiftState.run();
		currentLiftState.stop();
	}
	
	/* 简单起见,使用static 
	 * 检测状态运行
	 */
	public static void test()
	{
		currentLiftState = OpenState;
		currentLiftState.open();
		currentLiftState.close();
		currentLiftState.open();
		currentLiftState.close();
		currentLiftState.open();
		currentLiftState.close();
		
		currentLiftState.close();
		currentLiftState.run();
		currentLiftState.stop();
		currentLiftState.run();
		currentLiftState.stop();
		currentLiftState.run();
		currentLiftState.stop();
	}	
}

 各种状态实现:

public class LiftClose implements ILiftState
{
	@Override
	public void open()
	{
		System.out.println("the door is to open");
		LiftStates.currentLiftState = LiftStates.OpenState;
	}

	@Override
	public void close()
	{
		System.out.println("the door is already close");
	}

	@Override
	public void run()
	{
		System.out.println("the door is to run");
		LiftStates.currentLiftState = LiftStates.RunState;
	}

	@Override
	public void stop()
	{
		System.out.println("the door is to stop");
		LiftStates.currentLiftState = LiftStates.StopState;
	}
}
public class LiftOpen implements ILiftState
{
	@Override
	public void open()
	{
		System.out.println("the door is already open");
	}

	@Override
	public void close()
	{
		System.out.println("the door is to close");
		LiftStates.currentLiftState = LiftStates.CloseState;
	}

	@Override
	public void run()
	{
		System.out.println("state err");
	}

	@Override
	public void stop()
	{
		System.out.println("the door is to stop");
		LiftStates.currentLiftState = LiftStates.StopState;
	}
}
public class LiftRun implements ILiftState
{
	@Override
	public void open()
	{
		System.out.println("state err");
	}

	@Override
	public void close()
	{
		System.out.println("state err");
	}

	@Override
	public void run()
	{
		System.out.println("the door is alreay run");
	}

	@Override
	public void stop()
	{
		System.out.println("the door is to stop");
		LiftStates.currentLiftState = LiftStates.StopState;
	}
}
public class LiftStop implements ILiftState
{
	@Override
	public void open()
	{
		System.out.println("the door is to open");
		LiftStates.currentLiftState = LiftStates.OpenState;
	}

	@Override
	public void close()
	{
		System.out.println("the door is to close");
		LiftStates.currentLiftState = LiftStates.CloseState;
	}

	@Override
	public void run()
	{
		System.out.println("the door is to run");
		LiftStates.currentLiftState = LiftStates.RunState;
	}

	@Override
	public void stop()
	{
		System.out.println("the door is already stop");
	}
}

 

发表评论

3 × 5 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据