设计模式——状态模式

举报
yd_221104950 发表于 2020/12/03 00:24:24 2020/12/03
【摘要】 策略模式是围绕可以互换的算法来创建的。状态模式是通过改变对象内部的状态来帮助对象控制自己的行为。 状态模式定义 允许对象在内部状态改变时改变它的行为。 这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,行为会随着内部状态的改变而改变。 状态模式的类图: 类图解析: State:State接口定义了一个所有具体状态的共同接口;任何状态都要实现这个...

策略模式是围绕可以互换的算法来创建的。状态模式是通过改变对象内部的状态来帮助对象控制自己的行为。

状态模式定义

允许对象在内部状态改变时改变它的行为。

这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,行为会随着内部状态的改变而改变。

状态模式的类图:
在这里插入图片描述
类图解析:
State:State接口定义了一个所有具体状态的共同接口;任何状态都要实现这个相同的接口,这样一来,状态之间可以互相替换。
ConcreteState:具体状态,处理来自Context的请求。每个ConcreteState都提供了它自己对于请求的实现。所以,当Context改变状态时行为也跟着改变。
Context(上下文):是一个类,它可以拥有一些内部状态。
state.handle():不管在什么时候,只要有人调用Context的request()方法,它就会被委托到具体的状态对象来处理。

虽然类图和策略模式的很像,但是它们的意图是不一样的。以状态模式而言,我们将一群行为封装在状态对象中,context的行为随时可委托到那些状态对象中的一个。而以策略模式而言,客户通常要主动指定Context所要组合的策略对象是哪一个。

状态模式是利用许多不同的状态对象,Context对象会随着时间而改变状态,而任何状态改变都是定义好的。

我们举个三个状态的自动转换吧:就緒》运行》阻塞,就这么一个简单的例子来说明状态模式。

状态接口State:

package state;

public interface State { void handle();
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

具体状态对象:

ReadyState就緒状态

package concrete_state;
import client.MyClientContext;
import state.State;
public class ReadyState implements State { private MyClientContext myClientContext; public ReadyState(MyClientContext myClientContext) { this.myClientContext = myClientContext; } @Override public void handle() { System.out.println("I am waiting for cpu"); myClientContext.setCurrentState(myClientContext.getRunningState());  //就绪进入运行态 }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

RunningState运行状态

package concrete_state;
import client.MyClientContext;
import state.State;
public class RunningState implements State { private MyClientContext myClientContext; public RunningState(MyClientContext myClientContext) { this.myClientContext = myClientContext; } @Override public void handle() { System.out.println("I am running now"); myClientContext.setCurrentState(myClientContext.getBlockState());  //就运行态进入阻塞状 }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

BlockState阻塞状态:

package concrete_state;

import client.MyClientContext;
import state.State;
public class BlockState implements State { private MyClientContext myClientContext; public BlockState(MyClientContext myClientContext){ this.myClientContext = myClientContext; } @Override public void handle() { System.out.println("I am blocked.There is not enough resource for me to use."); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

Context上下文:

package client;


import concrete_state.BlockState;
import concrete_state.ReadyState;
import concrete_state.RunningState;
import state.State;

public class MyClientContext { private State readyState;  //就緒状态 private State runningState; //运行状态 private State blockState;//阻塞状态 private State currentState; //当前状态 public MyClientContext(){ readyState = new ReadyState(this); runningState = new RunningState(this); blockState = new BlockState(this); currentState = readyState; } public void request(){ currentState.handle(); } public State getCurrentState() { return currentState; } public void setCurrentState(State currentState) { this.currentState = currentState; } public State getBlockState() { return blockState; } public void setBlockState(State blockState) { this.blockState = blockState; } public State getRunningState() { return runningState; } public void setRunningState(State runningState) { this.runningState = runningState; } public State getReadyState() { return readyState; } public void setReadyState(State readyState) { this.readyState = readyState; }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

测试

import client.MyClientContext;

public class Main { public static void main(String[] args) { MyClientContext myClientContext = new MyClientContext(); myClientContext.request(); myClientContext.request(); myClientContext.request(); }
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

测试结果:

I am waiting for cpu
I am running now
I am blocked.There is not enough resource for me to use.

  
 
  • 1
  • 2
  • 3

具体的代码请下载demo来看。

demo代码地址

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/88866738

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。