美文网首页技术栈
2019-03-03——设计模式 状态模式

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

作者: 烟雨乱平生 | 来源:发表于2019-03-03 17:13 被阅读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。状态模式是不停的切换状态执行。策略模式的思想上是,考虑多种不同的业务规则将不同的算法封装起来,便于调用者选择调用。策略模式只是条件选择执行一次。

    相关文章

      网友评论

        本文标题:2019-03-03——设计模式 状态模式

        本文链接:https://www.haomeiwen.com/subject/vvtmuqtx.html