Java设计模式之行为型-状态模式(UML类图+案例分析)

这篇具有很好参考价值的文章主要介绍了Java设计模式之行为型-状态模式(UML类图+案例分析)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、基础概念

二、UML类图

三、角色设计

四、案例分析

五、总结


一、基础概念

状态模式允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类,状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

二、UML类图

Java设计模式之行为型-状态模式(UML类图+案例分析),Java,设计模式,java,设计模式,状态模式

三、角色设计

角色 描述
环境角色 维护一个State的实例,用来表示当前状态。并且定义了状态转换的set方法以及请求处理的业务方法。
抽象状态角色 定义一个接口封装与环境角色的一个特点接口相关行为
具体状态角色 实现抽象状态接口,封装状态对应的行为

四、案例分析

下面案例通过状态模式模拟了一个电梯系统,电梯在开门、关门、运行、停止不同状态下的行为逻辑,以及在客户端调用之间状态的转变。

定义了电梯状态的抽象接口,包含开门、关门、运行、停止等操作。这对应状态模式中的抽象状态角色:

public interface LiftState {

  /**
   * 设置环境变量
   * @param context
   */
  public void setContext(Context context);

  /**
   * 电梯开启操作
   */
  public void open();

  /**
   * 电梯关闭操作
   */
  public void close();

  /**
   * 电梯运行操作
   */
  public void run();

  /**
   * 电梯停止操作
   */
  public void stop();
}

实现了LiftState接口,作为具体状态类,封装了对应的状态下电梯的行为逻辑。这对应具体状态角色:

public class OpeningState implements LiftState {

    private Context context;

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

    @Override
    public void open() {
        //电梯门是打开的,不操作
        System.out.println("电梯门已打开.....");
    }

    @Override
    public void close() {
        //电梯门打开,可以执行关闭操作
        this.context.setLiftState(Context.CLOSING_STATE);
        this.context.close();
    }

    @Override
    public void run() {
        //电梯开门的时候不可以运行
    }

    @Override
    public void stop() {
        //电梯能开门必须是停下的
    }
}

public class ClosingState implements LiftState {

    private Context context;

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

    @Override
    public void open() {
        //关门状态下可以开门
        this.context.setLiftState(Context.OPENING_STATE);
        this.context.open();
    }
 
    @Override
    public void close() {
        //已经时关门状态,无需关门操作
        System.out.println("电梯门关闭.....");
    }
 
    @Override
    public void run() {
        //关了门自然可以运行
        this.context.setLiftState(Context.RUNNING_STATE);
        this.context.run();
    }
 
    @Override
    public void stop() {
        //电梯门关了但我不按楼层
        this.context.setLiftState(Context.CLOSING_STATE);
        this.context.stop();
    }
}

public class RunningState implements LiftState {

    private Context context;

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

    @Override
    public void open() {
        //运行状态下不可开门
    }
 
    @Override
    public void close() {
        //运行状态下已经是关好门的
    }
 
    @Override
    public void run() {
        //正在运行,无需操作
        System.out.println("电梯正在运行.......");
    }
 
    @Override
    public void stop() {
        //运行可停下
        this.context.setLiftState(Context.STOPPING_STATE);
        this.context.stop();
    }
}

public class StoppingState implements LiftState {

    private Context context;

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

    @Override
    public void open() {
        //停下的状态时可以开门的
        this.context.setLiftState(Context.OPENING_STATE);
        this.context.open();
    }
 
    @Override
    public void close() {
        //停下的时候已经是关了门的
    }
 
    @Override
    public void run() {
        //停下也可以继续运行
        this.context.setLiftState(Context.RUNNING_STATE);
        this.context.run();
    }
 
    @Override
    public void stop() {
        //已经停下无需操作
        System.out.println("电梯停止.......");
    }
}

维护当前状态,提供请求委托和状态切换方法,对应的是环境角色:


public class Context {
 
    //定义状态对象常量
    public final static OpeningState OPENING_STATE = new OpeningState();
    public final static ClosingState CLOSING_STATE = new ClosingState();
    public final static RunningState RUNNING_STATE = new RunningState();
    public final static StoppingState STOPPING_STATE = new StoppingState();
 
    //定义当前电梯状态变量
    private LiftState 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 Client {

  public static void main(String[] args) {
    Context context = new Context();
    context.setLiftState(new RunningState());
    context.open(); 
    context.close();
    context.run();
    context.stop();
  }

}

运行结果如下:

Java设计模式之行为型-状态模式(UML类图+案例分析),Java,设计模式,java,设计模式,状态模式

执行流程如下:

1、Client调用Context的开门、运行接口。

2、Context委托请求给当前的状态对象。

3、状态对象执行状态对应的行为,如果需要转变状态,则调用Context切换状态。

4、Context切换状态变量到新状态,新的状态对象成为当前活动状态5. 新的状态对象接受请求,执行相应行为

综上,状态对象封装行为,Context维护状态,Client只与Context交互,这样将状态转移逻辑聚合到状态对象中,实现了与Context的解耦。

状态模式很好地封装了状态切换逻辑,消除了庞大的条件分支语句,提供了可维护的状态机。 

五、总结

优点:

1、封装了状态转换逻辑,将不同状态的行为局部化,避免Context中的复杂条件分支。

2、方便增加和删除状态,只需要改变状态类即可。

3、可以避免直接修改Context而引入不一致性。

4、提高了Context类的复用性。

缺点:

1、增加了类的数量,复杂度较高。

2、状态切换的条件分散在多个状态类中,不便维护。

3、状态类只能通过Context来间接访问资源,限制性较大。

应用场景

1、一个对象的行为依赖于它的状态,并且它必须在运行时刻根据状态改变它的行为。

2、代码中包含大量与状态有关的条件语句,这些条件语句的作用是根据对象的状态选择不同的行为,这样会导致代码混乱和不易维护。

3、一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。

4、需要管理的状态数量过多,这样就可以将不同的状态表示为不同的类。

5、系统中对象状态转换的规则比较复杂,状态模式可以将状态的转换逻辑集中到一个地方。

符合的设计原则:

1开闭原则(Open Closed Principle)

状态模式可以在不修改对象自身的情况下,在运行时动态切换状态,扩展新的状态类。符合开闭原则的要求,对扩展开放,对修改关闭。

2单一职责原则(Single Responsibility Principle)

每个状态类只负责对象在某一个状态下的行为。状态类之间互不影响,符合单一职责原则。

3里氏替换原则(Liskov Substitution Principle)

子类可以扩展父类状态的行为,而不会破坏父类状态的行为预期。符合里氏替换原则。

4依赖倒置原则(Dependency Inversion Principle)

状态类都依赖于抽象状态类,而不是具体的Context类。符合依赖倒置原则。

5组合复用原则(Composite Reuse Principle)

客户端可以统一使用Context类,不需要与不同的具体状态类打交道。符合组合复用原则。

总之,状态模式通过将复杂状态转换逻辑提取到不同的状态类中,可以提高代码的灵活性和可维护性,是一种比较常用和有效的设计模式。文章来源地址https://www.toymoban.com/news/detail-562988.html

到了这里,关于Java设计模式之行为型-状态模式(UML类图+案例分析)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java设计模式之行为型-访问者模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 访问者模式是一种对象行为型设计模式,它能够在不修改已有对象结构的前提下,为对象结构中的每个对象提供新的操作。 访问者模式的主要作用是把对元素对象的操作抽象出来封装到访问者类中,这样就

    2024年02月16日
    浏览(54)
  • Java设计模式之创建型-原型模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析  4.1、通用实现(浅克隆) 4.2、深克隆 五、总结 原型模式通过复制已有对象作为原型,通过复制该原型来返回一个新对象,而不是新建对象,说白了就是不断复制相同的对象罢了。 角色 描述 抽象原型类 规定了具

    2024年02月15日
    浏览(46)
  • Java设计模式之创建型-建造者模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计  四、案例分析 五、总结 建造者模式是一种创建型设计模式,它使我们将一个复杂对象的构建步骤分离出来,使得同样的构建过程可以创建不同的表示。该模式的目的是将构建复杂对象的过程抽象化,从而减少代码的重复和复杂

    2024年02月15日
    浏览(40)
  • Java设计模式之结构型-桥接模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、支付方式 4.2、支付渠道  五、总结 桥接模式(Bridge Pattern)是一种结构型设计模式,其主要目的是“将抽象部分与实现部分分离,使它们都可以独立地变化”。 桥接模式的核心思想是把抽象(abstraction)与实现

    2024年02月13日
    浏览(43)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(50)
  • Java设计模式之创建型-单例模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、饿汉模式 4.2、懒汉模式(线程不安全) 4.3、懒汉模式(线程安全) 4.4、双重检索模式 4.5、静态内部类 4.6、枚举  五、总结 单例模式确保一个类只有一个实例,提供一个全局访问点。一般实现方式是把构造函

    2024年02月13日
    浏览(43)
  • Java设计模式之结构型-享元模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、游戏角色 五、总结 享元模式是一种结构型设计模式,主要用于减少创建大量相似对象所占用的内存,它通过共享技术来有效支持大量细粒度的对象。 角色 描述 抽象享元角色 定义出对象的外部状

    2024年02月16日
    浏览(45)
  • Java设计模式之结构型-装饰器模式(UML类图+案例分析)

    目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二  五、总结  装饰器模式是指不必在改变原有的类和不使用继承的情况下,动态扩展一个对象的功能。 角色 描述 抽象构件 是一个接口或者抽象类,定义我们最核心的对象 具体构件 抽象构件的实现,

    2024年02月11日
    浏览(35)
  • Java设计模式之UML类图

    UML图有很多种,但是并非必须掌握所有的UML图,才能完整系统分析和设计工作。一般说来,在UML图中,只要掌握类图、用例图、时序图的使用,就能完成大部分的工作。对于程序员来说,最频繁使用的莫过于类图。因此,这里我只讲解UML类图。 类图是面向对象系统建模中最常

    2024年02月03日
    浏览(41)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包