美文网首页技术栈
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——设计模式 状态模式

    特点 对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。所...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 设计模式——状态模式

    设计模式——状态模式 在状态模式中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。 优点: 减少...

  • 设计模式-状态设计模式

    1.定义 对于某个操作,由于其状态的不同,表现出的行为会不同(如遥控器进行音量增加的操作,在电视是开机状态下是可以...

  • 设计模式——状态模式

    前言 设计模式是指导一个程序猿以更好的姿态处理一些问题,而不再像刚学编程的我们,只会使用if-else分支语句,或...

  • 设计模式--状态模式

    基本常识:策略模式与状态模式是双胞胎,在出生时才分开。 假设公司有个糖果机,1当糖果机由糖果,投入25分钱,转动曲...

  • 设计模式——状态模式

    在阎宏博士的《JAVA与模式》一书中开头是这样描述状态(State)模式的:状态模式,又称状态对象模式(Patte...

  • 设计模式《状态模式》

    引言   上一节我们说了策略模式。这一节我们讲讲策略模式的双胞胎弟弟:状态模式,这个模式大家可能不常见,也不常用,...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 设计模式 - 状态模式

    模式定义 允许一个对象在其内部状态发生改变时改变它的行为。对象看起来似乎修改了它的类。 状态模式(State Pa...

网友评论

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

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