参考jdon:http://www.jdon.com/designpatterns/designpattern_State.htm
我觉得state应该用的很多,许多动作都是依赖于状态的
说说我理解的几个要点:
1.state主要用在需要多个状态开关切换,且有多种切换方式
2.对象的操作决定于状态
3.将状态和状态相关(甚至是状态切换的操作)都放到state中
4.context负责操作调用state,但不负责管理,管理由state自己负责
我自己也写一个例子:
售票员买票,在空闲和忙碌这两种状态切换
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package state;
/**
*
* @author blacklaw
*/
public class DP_State {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Conductor conductor = new Conductor();
conductor.setState(new Idle());
conductor.sell();
conductor.next();
conductor.sell();
conductor.next();
conductor.sell();
}
abstract class State{
//下一步
abstract public void next(Conductor c);
//返回
abstract public void back(Conductor c);
abstract public void sell();
}
/**
* 空闲状态
*/
static class Idle extends State{
@Override
public void next(Conductor c) {
c.state = new Busy();
}
@Override
public void sell() {
System.out.println("我来给你准备一张票");
}
@Override
public void back(Conductor c) {
c.state = new Busy();
}
}
/**
* 忙碌状态
*/
static class Busy extends State{
@Override
public void next(Conductor c) {
c.state = new Idle();
}
@Override
public void sell() {
System.out.println("等等,我很忙!");
}
@Override
public void back(Conductor c) {
c.state = new Idle();
}
}
/**
* 售票员
*/
static class Conductor{
State state;
public void setState(State s){
this.state = s;
}
public void next(){
this.state.next(this);
}
public void back(){
this.state.back(this);
}
public void sell(){
this.state.sell();
}
}
}