状态模式

1、简介

  定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

  状态模式允许一个对象在其内部状态改变时改变其行为,这个对象看上去就像改变了他的类一样

2、状态模式类图

3、状态模式涉及到的角色

  从上图可以看出  状态模式涉及到以下几个角色

  3.1、抽象状态(State)角色:定义一个接口,用以封装环境对象的一个特定的状态所对应的行为

  3.2、具体状态(ConcreteState)角色:每一个具体状态类都实现了环境的一个状态所对应的行为

  3.3、环境(Context)角色:环境角色持有一个状态类的实例,这个状态类的实例给出环境对象的现有状态

4、源代码

  4.1、抽象状态角色

 
package State;
/**
 * ********************************************************    
* @ClassName: State 
* @Description: 抽象状态接口
***********************************************************
 */
public interface State {
    String SimpleOperation();
}
 

  4.2、具体状态角色1

 
package State;
/**
 * ********************************************************    
* @ClassName: ConcreteState 
* @Description: 具体状态类
***********************************************************
 */
public class Sit implements State{

    @Override
    public String SimpleOperation() {
    return    "我坐下了";
    }

}
 

  4.3、具体状态角色2

 
package State;
/**
 * ********************************************************    
* @ClassName: Stand 
* @Description: 具体状态类
***********************************************************
 */
public class Stand implements State{

    @Override
    public String SimpleOperation() {
        return "我站起来了";
    }

}
 

  4.4、环境角色

 
package State;
/**
 * ********************************************************    
* @ClassName: Context 
* @Description:环境类 环境类持有一个State对象  并把所有的行为委派给此对象
***********************************************************
 */
public class Context {
    private State state;
    
    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    
    public String stateManage(){
        return state.SimpleOperation();
    }
    
}
 

  4.5、测试客户端

 
package State;
/**
 * ********************************************************    
* @ClassName: Client 
* @Description: 状态模式测试客户端
***********************************************************
 */
public class Client {

    public static void main(String[] args) {
        Context context = new Context();
        context.setState(new Sit());
        System.out.println(context.stateManage());
        context.setState(new Stand());
        System.out.println(context.stateManage());
    }
}
posted @ 2021-08-23 14:37  bluesky1  阅读(42)  评论(0编辑  收藏  举报