技术栈

2019-03-03——设计模式 状态模式

2019-03-03  本文已影响0人  烟雨乱平生

特点

对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。所以状态模式就是允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。同时状态模式是将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。但是这样就会导致系统的结构和实现都会比较复杂,如果使用不当就会导致程序的结构和代码混乱,不利于维护。

要使用状态模式,我们必须明确两个东西:状态和每个状态下执行的动作。

主要角色

实现

@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。状态模式是不停的切换状态执行。策略模式的思想上是,考虑多种不同的业务规则将不同的算法封装起来,便于调用者选择调用。策略模式只是条件选择执行一次。

上一篇下一篇

猜你喜欢

热点阅读