浅学设计模式之状态<state>模式
来源:互联网 发布:淘宝助理导出csv 编辑:程序博客网 时间:2024/05/22 02:37
State模式定义:
不同的状态,不同的行为; 或者说,每个状态有着相应的行为.
使用情况:
状态模式在工作流或游戏等各种系统中有大量使用,甚至是这些系统的核心功能设计,例如在典型的OA中,一个批文的状态有多种:未办;正在办理;正在批示;正在审核;已经完成等各种状态,使用状态机可以封装这个状态的变化规则,从而达到扩充状态时,不必涉及到状态的使用者。
在网游中,一个游戏活动存在开始、开玩、正在玩、输赢等状态,使用状态模式就可以实现游戏状态的总控,而游戏状态决定了游戏的各个方面,使用状态模式可以对整个游戏架构功能实现起到决定的主导作用。
状态模式可以有效的替换充满在程序中的if else语句:将不同条件下的行为封装在一个类里面,再给这些类一个统一的父类来约束他们。看一下状态模式的角色组成:
- 使用环境(Context)角色:客户程序是通过它来满足自己的需求。它定义了客户程序需要的接口;并且维护一个具体状态角色的实例,这个实例来决定当前的状态。
- 状态(State)角色:定义一个接口以封装与使用环境角色的一个特定状态相关的行为。
- 具体状态(Concrete State)角色:实现状态角色定义的接口。
之间的协作关系:
- Context将于状态相关的请求委托给当前的ConcreteState对象处理。
- Context可将自身作为一个参数传递给处理该请求的状态对象,这使得状态对象在必要的时候可访问Context。
- Context是客户使用的主要接口,客户可用状态对象来配置一个Context,一旦一个Context配置完毕,他的客户不再需要直接与状态对象打交道。
- Context或者ConcreteState子类都可以决定哪个状态是另外那个状态的后继者,以及是在何种条件下进行状态转换。
状态模式实质:
使用状态模式前,客户端外界需要介入改变状态,而状态改变的实现是琐碎或复杂的。
使用状态模式后,客户端外界可以直接使用事件Event实现,根本不必关心该事件导致如何状态变化,这些是由状态机等内部实现。
这是一种Event-condition-State,状态模式封装了condition-State部分。
每个状态形成一个子类,每个状态只关心它的下一个可能状态,从而无形中形成了状态转换的规则。如果新的状态加入,只涉及它的前一个状态修改和定义。
状态转换有几个方法实现:一个在每个状态实现next(),指定下一个状态;还有一种方法,设定一个StateOwner,在StateOwner设定stateEnter状态进入和stateExit状态退出行为。
状态从一个方面说明了流程,流程是随时间而改变,状态是截取流程某个时间片。
适用场合:
(1)
一个state,包括两部分: 对象 + 对象内部的属性(属性接口+具体属性)
一个对象,要有其属性,以及其setter,getter.且设置好其初始状态+一个调用显示状态的方法(里面就是状态调用自身的显示方法).
一个属性接口,应该有一个执行的方法.
一个具体属性,须包含对象进去,实现方法中,须设置对象下一个要显示的属性-->从而在对象下次调用方法时,其属性值会变化.
代码例子:
该代码使用电梯作为模板,设置了四种状态
State接口:
- public interface IState {
- void open();
- void close();
- void runing();
- void stop();
- }
具体角色(Concrete State)
- public class OpenState implements IState {
- private Lift lift;
- public OpenState(Lift lift){
- this.lift = lift;
- }
- @Override
- public void open() {
- // TODO Auto-generated method stub
- System.out.println("门已经开了!!!");
- }
- @Override
- public void close() {
- // TODO Auto-generated method stub
- System.out.println("好的,现在关门");
- lift.setState(lift.getCloseState());
- }
- @Override
- public void runing() {
- // TODO Auto-generated method stub
- System.out.println("现在门开着,电梯没办法运行");
- }
- @Override
- public void stop() {
- // TODO Auto-generated method stub
- System.out.println("现在门开着,电梯是停止状态");
- }
- }
- ublic class RunState implements IState {
- private Lift lift;
- public RunState(Lift lift){
- this.lift = lift;
- }
- @Override
- public void open() {
- // TODO Auto-generated method stub
- System.out.println("现在正在运行,没办法开门");
- }
- @Override
- public void close() {
- // TODO Auto-generated method stub
- System.out.println("现在是运行状态,门已经关闭");
- }
- @Override
- public void runing() {
- // TODO Auto-generated method stub
- System.out.println("电梯正在运行中....");
- }
- @Override
- public void stop() {
- // TODO Auto-generated method stub
- System.out.println("让电梯停止");
- lift.setState(lift.getStopState());
- }
- }
- public class StopState implements IState {
- private Lift lift;
- public StopState(Lift lift){
- this.lift = lift;
- }
- @Override
- public void open() {
- // TODO Auto-generated method stub
- System.out.println("现在打开电梯");
- lift.setState(lift.getOpenState());
- }
- @Override
- public void close() {
- // TODO Auto-generated method stub
- System.out.println("电梯现在关闭");
- lift.setState(lift.getStopState());
- }
- @Override
- public void runing() {
- // TODO Auto-generated method stub
- System.out.println("好吧,让电梯开始运行");
- lift.setState(lift.getRunState());
- }
- @Override
- public void stop() {
- // TODO Auto-generated method stub
- System.out.println("现在正是在停止状态");
- }
- }
- public class CloseState implements IState {
- private Lift lift;
- public CloseState(Lift lift){
- this.lift = lift;
- }
- @Override
- public void open() {
- // TODO Auto-generated method stub
- System.out.println("正要准备打开门");
- lift.setState(lift.getOpenState());
- }
- @Override
- public void close() {
- // TODO Auto-generated method stub
- System.out.println("现在门正在关着");
- }
- @Override
- public void runing() {
- // TODO Auto-generated method stub
- System.out.println("现在让电梯运行");
- lift.setState(lift.getRunState());
- }
- @Override
- public void stop() {
- // TODO Auto-generated method stub
- System.out.println("现在让电梯停止");
- lift.setState(lift.getStopState());
- }
- }
context类:
- public class Lift {
- private IState openState;
- private IState closeState;
- private IState runState;
- private IState stopState;
- private IState state ;
- public Lift(){
- openState = new OpenState(this);
- closeState = new CloseState(this);
- runState = new RunState(this);
- stopState = new StopState(this);
- state = stopState;
- }
- public void openLift(){
- state.open();
- }
- public void runLift(){
- state.runing();
- }
- public void stopLift(){
- state.stop();
- }
- public void closeLift(){
- state.close();
- }
- public void setState(IState state){
- this.state = state;
- }
- public IState getOpenState() {
- return openState;
- }
- public IState getCloseState() {
- return closeState;
- }
- public IState getRunState() {
- return runState;
- }
- public IState getStopState() {
- return stopState;
- }
- }
测试类:
- public class Test {
- public static void main(String[] args){
- Lift lift = new Lift();
- //好,现在打开电梯门进去
- lift.openLift();
- //关闭电梯门
- lift.closeLift();
- //让电梯开始运行
- lift.runLift();
- //电梯到了,停止
- lift.stopLift();
- //打开电梯门
- lift.openLift();
- //现在一个小朋友乱按电梯
- Lift lift2 = new Lift();
- //好,现在打开电梯门进去
- lift2.openLift();
- //又按了次开门
- lift2.openLift();
- //开门状态下,让电梯运行
- lift2.runLift();
- //好吧,不玩了,关闭电梯门
- lift2.closeLift();
- //让电梯开始运行
- lift2.runLift();
- //在运行过程中想打开门
- lift2.openLift();
- //电梯到了,停止
- lift2.stopLift();
- //打开电梯门
- lift2.openLift();
- }
- }
测试结果:
- 现在打开电梯
- 好的,现在关门
- 现在让电梯运行
- 让电梯停止
- 现在打开电梯
- ---------
- 现在打开电梯
- 门已经开了!!!
- 现在门开着,电梯没办法运行
- 好的,现在关门
- 现在让电梯运行
- 现在正在运行,没办法开门
- 让电梯停止
- 现在打开电梯
状态模式,也跟观察者模式一样,是一对多的模式。但观察者模式是“一”变了,所有的“多”也会更新。状态模式,强调的是:“多”是“一”的各个状态,“一”的各个状态,进行不断的循环。
- 状态模式,也跟观察者模式一样,是一对多的模式。但观察者模式是“一”变了,所有的“多”也会更新。状态模式,强调的是:“多”是“一”的各个状态,“一”的各个状态,进行不断的循环。
- 状态模式的主要使用方法,是作为实例变量,通过set属性方法,或者构造器把状态接口的具体实现类的实例传递进来
- 通常命令模式的接口中只有一个方法。而状态模式的接口中有1个或者多个方法。命令模式的主要的使用方式是参数回调模式。命令接口作为方法的参数传递进来。然后,在方法体内回调该接口。
- 浅学设计模式之状态<state>模式
- 浅学设计模式之状态<state>模式
- 设计模式之State(状态)
- 设计模式之状态设计模式,state
- 设计模式之state状态模式
- 设计模式之State Pattern 状态模式。
- Java设计模式之State(状态模式)
- 设计模式之State(状态模式)
- 设计模式之(十七)状态模式State
- 设计模式之状态模式(State Pattern)
- 设计模式之十 --- 状态(State)模式
- 【设计模式】之状态模式(State)
- 设计模式之十 --- 状态(State)模式
- java设计模式之状态 模式State
- 设计模式之状态模式(State)
- 设计模式之状态模式(state model)
- 设计模式之状态模式(State)
- 设计模式入门之状态模式State
- java学习笔记1 - Mybatis简单实例
- hdu1501之动态规划
- 利用matlab把向量b插入到a中
- Android的图片异步加载
- javascript 删除某一个元素下面所有节点
- 浅学设计模式之状态<state>模式
- C++练习之 判断是否为完数
- java排序算法_001冒泡排序
- maven创建web项目
- Javascript获取元素所在的页面位置
- Google Analytics白屏问题解决方法
- winhttp ssl WINHTTP_CALLBACK_STATUS_FLAG_INVALID_CA
- win7下为python设置全局路径
- 自己写的定时任务管理器