2019-03-03——设计模式 状态模式
2019-03-03 本文已影响0人
烟雨乱平生
特点
对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。所以状态模式就是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。同时状态模式是将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。但是这样就会导致系统的结构和实现都会比较复杂,如果使用不当就会导致程序的结构和代码混乱,不利于维护。
要使用状态模式,我们必须明确两个东西:状态和每个状态下执行的动作。
主要角色
- 环境(Context)角色:也称为上下文,它定义了客户感兴趣的接口,维护一个当前状态,并将与状态相关的操作委托给当前状态对象来处理。
- 抽象状态(State)角色:定义一个接口,用以封装环境对象中的特定状态所对应的行为。
- 具体状态(Concrete State)角色:实现抽象状态所对应的行为。
实现
@Data
public class Context {
private ThreadState threadState;
private String threadName;
public Context(String threadName){
this.threadName = threadName;
}
public void createThread(){
new NewState().handler(this);
}
public void start(){
new StartState().handler(this);
}
public void run(){
new RunningState().handler(this);
}
public void hangup(){
new BlockState().handler(this);
}
public void kill(){
new StopState().handler(this);
}
}
public interface ThreadState {
void handler(Context context);
}
public class NewState implements ThreadState {
@Override
public void handler(Context context) {
System.out.println("创建了一个线程:"+context.getThreadName());
context.setThreadState(this);
}
}
public class StartState implements ThreadState {
@Override
public void handler(Context context) {
if(NewState.class.equals(context.getThreadState().getClass())){
System.out.println("获取CPU,准备运行线程"+context.getThreadName());
context.setThreadState(this);
}else{
System.out.println("线程"+context.getThreadName()+"没有创建,不允许运行");
}
}
}
public class RunningState implements ThreadState {
@Override
public void handler(Context context) {
if(StartState.class.equals(context.getThreadState().getClass())){
System.out.println("开始运行线程"+context.getThreadName());
context.setThreadState(this);
}else{
System.out.println("线程"+context.getThreadName()+"没有获取到CPU,无法运行");
}
}
}
public class BlockState implements ThreadState {
@Override
public void handler(Context context) {
if(RunningState.class.equals(context.getThreadState().getClass())){
System.out.println("线程"+context.getThreadName()+"挂起");
context.setThreadState(this);
}else{
System.out.println("线程"+context.getThreadName()+"没有运行,不能挂起");
}
}
}
public class StopState implements ThreadState {
@Override
public void handler(Context context) {
System.out.println("线程"+context.getThreadName()+"终止");
}
}
状态模式和策略模式,两个模式的实现类图虽然一致,但是实现目的不一样!状态模式的的思想是,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B。状态模式是不停的切换状态执行。策略模式的思想上是,考虑多种不同的业务规则将不同的算法封装起来,便于调用者选择调用。策略模式只是条件选择执行一次。