1、状态模式的简单介绍:

a、核心:

-  用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。

    

b、结构:

-  Context 环境类:环境类中维护一个 State 对象,他是定义了当前的状态。

-  State 抽象状态类

-  ConcreteState 具体状态类:每一个类封装了一个状态对应的行为。


2、简单的代码演示: 

a、HotelRoomState 接口是 State 抽象状态类,FreeState、CheckedInState、BookedState 类是 ConcreteState 具体状态类。

package com.geeklicreed.state;

public interface HotelRoomState {
	void handle();
}
package com.geeklicreed.state;

public class FreeState implements HotelRoomState {

	@Override
	public void handle() {
		System.out.println("宾馆该房间处于空闲的状态");
	}

}
package com.geeklicreed.state;

public class CheckedInState implements HotelRoomState{

	@Override
	public void handle() {
		System.out.println("宾馆该房间处于入住状态!");
	}

}
package com.geeklicreed.state;

public class BookedState implements HotelRoomState{

	@Override
	public void handle() {
		System.out.println("宾馆该房间处于预定状态!");
	}

}
package com.geeklicreed.state;

public class HotelRoomContext {
	private HotelRoomState hotelRoomState;
	
	public void setHotelRoomState(HotelRoomState state){
		System.out.println("该宾馆房间的状态已修改");
		this.hotelRoomState = state;
		hotelRoomState.handle();
	}
}


b、看看 Client 测试类输出的结果以及示例的类图关系。

package com.geeklicreed.state;

public class Client {
	public static void main(String[] args) {
			HotelRoomContext context = new HotelRoomContext();
			
			context.setHotelRoomState(new CheckedInState());
			System.out.println("------------------------");
			context.setHotelRoomState(new BookedState());
			
			/*输出结果为:
			该宾馆房间的状态已修改
			宾馆该房间处于入住状态!
			------------------------
			该宾馆房间的状态已修改
			宾馆该房间处于预定状态!*/
	}
}


3、开发中常见的场景:

-  银行系统中帐号状态的管理

-  OA 系统中公文状态的管理

-  酒店系统中,房间状态的管理

-  线程对象各状态之间的切换