设计模式之状态模式

导读:本篇文章讲解 设计模式之状态模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


前言

在这里插入图片描述


提示:以下是本篇文章正文内容,下面案例可供参考

一、状态模式是什么?

基本介绍

  1. 状态模式(State Pattern):它主要用来解决对象在多种状态转换时,需要对外输出不同的行为的问题。状态和行为的是一一对应的,状态之间可以相互转换
  2. 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类
    在这里插入图片描述

二、使用步骤

状态类

其中关联了四个状态值

public abstract class LiftState {

    protected Context context;

    public void setContext(Context context) {
        this.context = context;
    }

    // 开启
    public abstract void open();
    // 关闭
    public abstract void close();
    // 运行
    public abstract void run();
    // 停止
    public abstract void stop();
}

编写环境角色类

public class Context {

    public final static OpeningState OPENING_STATE = new OpeningState();
    public final static ColseingState COLSEING_STATE = new ColseingState();
    public final static StopingState STOPING_STATE = new StopingState();
    public final static RuningState RUNING_STATE = new RuningState();


    // 状态变量
    private LiftState liftState;

    public LiftState getLiftState() {
        return liftState;
    }

    public void setLiftState(LiftState liftState) {
        this.liftState = liftState;
        this.liftState.setContext(this);
    }

    public void open(){
        this.liftState.open();
    }

    public void close(){
        this.liftState.close();
    }

    public void run(){
        this.liftState.run();
    }

    public void stop(){
        this.liftState.stop();
    }
}

四个状态类

关闭状态

public class ColseingState extends LiftState {
    @Override
    public void open() {
        super.context.setLiftState(Context.OPENING_STATE);
        super.context.open();
    }

    @Override
    public void close() {
        System.out.println("电梯们关闭。。。");
    }

    @Override
    public void run() {
        super.context.setLiftState(Context.RUNING_STATE);
        super.context.run();
    }

    @Override
    public void stop() {
        super.context.setLiftState(Context.STOPING_STATE);
        super.context.stop();
    }
}

启动状态

public class OpeningState extends LiftState {
    @Override
    public void open() {
        System.out.println("电梯开启");
    }

    @Override
    public void close() {
        super.context.setLiftState(Context.COLSEING_STATE);
        super.context.close();
    }

    @Override
    public void run() {
        // 什么都不做
    }

    @Override
    public void stop() {
        // no
    }
}

运行状态

public class RuningState extends LiftState {
    @Override
    public void open() {

    }

    @Override
    public void close() {

    }

    @Override
    public void run() {
        System.out.println("电梯正在运行中");
    }

    @Override
    public void stop() {
        super.context.setLiftState(Context.STOPING_STATE);
        super.context.stop();
    }
}

停止状态

public class StopingState extends LiftState {
    @Override
    public void open() {
        super.context.setLiftState(Context.OPENING_STATE);
        super.context.getLiftState().open();
    }

    @Override
    public void close() {
        super.context.setLiftState(Context.COLSEING_STATE);
        super.context.getLiftState().close();
    }

    @Override
    public void run() {
        super.context.setLiftState(Context.RUNING_STATE);
        super.context.getLiftState().run();
    }

    @Override
    public void stop() {
        System.out.println("电梯停止了。。。");
    }
}

使用

public class Client {

    public static void main(String[] args) {

        // 创建环境对象
        Context context = new Context();
        // 设置当前电梯状态
        context.setLiftState(new ColseingState());

        context.open();
        context.run();
        context.close();
        context.stop();
    }

}

输出

在这里插入图片描述

总结

  1. Context 类为环境角色,用于维护State实例,这个示例定义当前状态
  2. State 是抽象类状态角色,定义一个接口封装与Context的一个特点接口相关行为
  3. ConcreteState 具体的状态角色,每个子类实现一个与Context的一个状态相关行为

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112531.html

(0)
Java光头强的头像Java光头强

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!