模式定义
State模式允许一个对象在内部状态改变时它的行为也随着改变,实现其类在运行时的动态修改。
使用范围
- 行为取决于对象的状态
- 太多的分支语句来区别处理不同状态下的行为
使用方法
![](http://www.zigzagsoft.net/main/designpattern_image/state-pattern.jpg)
举例说明
Socket网络编程中假设我们定义它有三个状态,Open, Listen和Close。从不同的状态中抽象出一个接口 TcpStatus。该接口定义了网络操作中的三个方法,建立连接,显示当前状态,退出连接。
public interface TcpStatus { void establish(); void exit(); void acknowledge(); }
再定义TcpStatus的三个状态。注意每个状态下的不同方法定义了不同的行为,该行为是根据当前状态而定的。
public class TcpOpen implements TcpStatus{ public void acknowledge() { System.out.println("tcp connection opened"); } public void exit() { System.out.println("Conn Closing"); } public void establish() { System.out.println("Conn opened"); } } ---------------- public class TcpListen implements TcpStatus{ public void acknowledge() { System.out.println("Conn listening"); } public void establish() { System.out.println("Conn opened, can not open again"); } public void exit() { System.out.println("Closing"); } } ---------------- public class TcpClose implements TcpStatus { public void acknowledge() { System.out.println("Conn closed"); } public void exit() { System.out.println("Conn closed, can not close again."); } public void establish() { System.out.println("Conn opening"); } }
建立一个Context,用来管理状态的切换和更新。
public class TcpConnection { private TcpStatus status; public void open(){ this.status = new TcpOpen(); this.status.establish(); this.status = new TcpListen(); } public void close(){ this.status.exit(); this.status = new TcpClose(); } public void acknowledge(){ this.status.acknowledge(); } }
客户端方法:
public class StateClient { public static void main(String args[]){ TcpConnection conn = new TcpConnection(); conn.open(); conn.acknowledge(); conn.close(); conn.acknowledge(); conn.open(); conn.close(); conn.acknowledge(); conn.close(); } }
运行结果:
Conn opened Conn listening Closing Conn closed Conn opened Closing Conn closed Conn closed, can not close again.
下载示例