千家信息网

怎么用状态模式代替if-else

发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,本篇内容主要讲解"怎么用状态模式代替if-else",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用状态模式代替if-else"吧!简介状态模式是行为型
千家信息网最后更新 2025年02月04日怎么用状态模式代替if-else

本篇内容主要讲解"怎么用状态模式代替if-else",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么用状态模式代替if-else"吧!

简介

状态模式是行为型设计模式的一种。其设计理念是当对象的内部状态发生改变时,随之改变其行为。状态和行为之间是一一对应的。

该模式主要用于,对象的行为依赖于它的状态,并且其行为是随着状态的改变而切换时。

状态模式UML类图

类图讲解

State:抽象状态接口(也可以定义成抽象类),该接口封装了所有状态所对应的行为。

ConcreteStateA/B:具体状态类,该类实现了抽象状态接口,会根据自身对应的状态来实现接口中定义的方法,还有另一个功能是指明如何过渡到下一个状态。

Context:环境(上下文)角色,该类负责状态的切换,还持有一个State实例,代表当前环境所处状态。

案例讲解

案例:通过状态模式来实现自助售卖机的功能。

状态接口

public interface State {   // 挑选商品   void choose();   // 付款   boolean payment();   // 分发商品   void dispenseCommodity(); }

挑选商品状态类

public class ChooseGoods implements State {    VendingMachine machine;    public ChooseGoods(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     if (machine.getCount() > 0) {       System.out.println("商品挑选成功,请及时付款!");       machine.setState(machine.getPaymentState());     } else {       System.out.println("很遗憾,商品售罄了!");       machine.setState(machine.getEmptyState());     }   }    @Override   public boolean payment() {     System.out.println("请先挑选商品!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("请先挑选商品!");   } }

付款状态类

public class PaymentState implements State {    VendingMachine machine;    public PaymentState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("商品已选购完成请勿重复挑选");   }    @Override   public boolean payment() {     Random random = new Random();     int num = random.nextInt(10);     if(num % 2 == 0){       System.out.println("付款成功!");       machine.setState(machine.getDispenseCommodityState());       return true;     }     System.out.println("付款失败,请重新支付!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("请先完成支付!");   } }

商品售罄状态类

public class EmptyState implements State {    VendingMachine machine;    public EmptyState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("对不起商品已售罄!");   }    @Override   public boolean payment() {     System.out.println("对不起商品已售罄!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("对不起商品已售罄!");   } }

分发商品状态类

public class DispenseCommodityState implements State {    VendingMachine machine;    public DispenseCommodityState(VendingMachine machine) {     this.machine = machine;   }    @Override   public void choose() {     System.out.println("请及时取走您的商品!");   }    @Override   public boolean payment() {     System.out.println("请及时取走您的商品!");     return false;   }    @Override   public void dispenseCommodity() {     System.out.println("请及时取走您的商品!");     machine.setState(machine.getChooseGoods());   } }

自动售货机 => Context角色

public class VendingMachine {   // 表示当前状态   private State state = null;   // 商品数量   private int count = 0;   private State chooseGoods = new ChooseGoods(this);   private State paymentState = new PaymentState(this);   private State dispenseCommodityState = new DispenseCommodityState(this);   private State emptyState = new EmptyState(this);    public VendingMachine(int count) {     this.count = count;     this.state = this.getChooseGoods();   }    // 购买商品   public void purchase() {     // 挑选商品     state.choose();     // 支付成功     if (state.payment()) {       // 分发商品       state.dispenseCommodity();     }   }      // 获取商品后将商品减一   public int getCount() {     return count--;   }      // get和set方法 ...  }

客户端测试类

public class Client {    public static void main(String[] args) {     VendingMachine machine = new VendingMachine(1);     for (int i = 1; i < 4; i++) {       System.out.println("第" + i + "次购买。");       machine.purchase();     }   } }

执行结果

总结

1、状态模式将每个状态所对应的行为封装到一个类中,大大提高了代码的可读性。并且通过这样的设计还可以消除多余的if-else语句,方便代码的维护。

2、状态模式符合"开闭原则",容易增加和删除状态。

3、任何事情都有利弊,状态模式也不例外。其最显著的问题是,每个状态都要对应一个类,当状态过多时会产生大量的类,从而加大维护成本。

4、应用场景:当一个需求有很多状态,并且状态之间会进行转换,不同状态还对应不同的行为时就可以考虑使用"状态模式"

到此,相信大家对"怎么用状态模式代替if-else"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

状态 商品 模式 行为 接口 成功 方法 支付 设计 不同 之间 代码 内容 功能 对象 案例 环境 角色 切换 学习 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 外文历史文献免费数据库 北京数据库空投箱销售 学院举行网络安全知识竞赛 无现金社会网络安全 扬州java软件开发服务 虹口区多层软件开发设备 数据库改变gbk支持中文 中关村科技园互联网金融中心 无法下载服务器列表 腾讯服务器的质量怎么样 腾讯内部软件开发文档 饥荒联机版本地服务器添加管理员 公安局网络安全监察举报网站 数据库设计中经常遇到的问题 互联网科技战役中小学生开课 csgo捆绑专用服务器失败 网络架构以及网络安全 删除软件开发工具包 无线网络安全的基本业务是 万人在线服务器 计算机网络技术求职规划书 当代小学生网络安全宣传标语 软管理系统服务器部分文件被破坏 gdpr 和网络安全法对比 无锡技术软件开发销售公司 网络安全大赛给我们的启示 华为手机连接到服务器出现问题 元老院调查报告网络安全 特朗普解雇美国网络安全 万人在线服务器
0