尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

软件设计模式(tyutJAVA 状态模式实验) - 详解

软件设计模式(tyutJAVA 状态模式实验) - 详解
📅 发布时间:2026/6/20 4:43:33

第1关:状态模式

任务描述

请你为某商城设计一个会员程序,要求如下:

  • 商城将顾客分为普通、黄金、VIP 三个等级,普通会员消费时没有折扣,黄金会员95折,VIP 会员85折;

  • 积分规则:按单笔消费金额等额取整法,例如客户消费1元积1分,消费1.5元也是积一分,消费2元则积2分;

  • 刚加入的顾客被归入普通会员,要求填入姓名;当顾客积分大于等于500时自动升级为黄金会员,下次享受黄金会员待遇;当积分大于等于2000时自动升级为 VIP 会员,下次起享受 VIP 会员待遇。注意:会员升级过程不能跳级。

实现方式

  1. 确定哪些类是上下文。 它可能是包含依赖于状态的代码的已有类; 如果特定于状态的代码分散在多个类中, 那么它可能是一个新的类;

  2. 声明状态接口。 虽然你可能会需要完全复制上下文中声明的所有方法, 但最好是仅把关注点放在那些可能包含特定于状态的行为的方法上;

  3. 为每个实际状态创建一个继承于状态接口的类。 然后检查上下文中的方法并将与特定状态相关的所有代码抽取到新建的类中。在将代码移动到状态类的过程中, 你可能会发现它依赖于上下文中的一些私有成员。 你可以采用以下几种变通方式:

    • 将这些成员变量或方法设为公有;

    • 将需要抽取的上下文行为更改为上下文中的公有方法, 然后在状态类中调用。 这种方式简陋却便捷, 你可以稍后再对其进行修补;

    • 将状态类嵌套在上下文类中。 这种方式需要你所使用的编程语言支持嵌套类。

  1. 在上下文类中添加一个状态接口类型的引用成员变量, 以及一个用于修改该成员变量值的公有设置器;

  2. 再次检查上下文中的方法, 将空的条件语句替换为相应的状态对象方法;

  3. 为切换上下文状态, 你需要创建某个状态类实例并将其传递给上下文。 你可以在上下文、 各种状态或客户端中完成这项工作。 无论在何处完成这项工作, 该类都将依赖于其所实例化的具体类。

编程要求

根据提示,在右侧编辑器 Begin-End 内补全代码,需要补充代码的文件如下:

  • AbstractState.java
  • CommonState.java
  • GoldState.java
  • clubAccount.java

测试说明

输入第一行表示顾客姓名,第二行给出一个正整数 n(n⩽10)表示消费次数。随后 n 行,每行给出1个实数(消费金额)。输出 n 行结果,格式为 XX 本次消费金额为 XX,折扣后为 XX

测试输入: 张三3612.01621.0100.0

预期输出: 张三注册成功普通会员本次消费金额:612.0,折扣后:612.0,当前积分:612黄金会员本次消费金额:1621.0,折扣后:1539.9,当前积分:2151VIP会员本次消费金额:100.0,折扣后:85.0,当前积分:2236

1

package step1;
public abstract class AbstractState {protected clubAccount account;//账户protected double discount;//折扣比例protected int userPoints;//积分protected String stateName;//状态名public void Consume(double money) {/********** Begin *********/// 先计算折扣后金额和积分double discountedAmount = money * discount;int pointsEarned = (int) Math.floor(discountedAmount);userPoints += pointsEarned;// 检查是否需要状态变更checkState();/********** End *********////现金消费System.out.println(stateName+"本次消费金额:"+money+",折扣后:"+String.format("%.1f",discountedAmount)+",当前积分:"+userPoints);}///若有积分抵现金或领取礼物则需要修改checkState原型,请自由扩展积分消费函数public abstract void checkState();
}

2

package step1;
public class CommonState extends AbstractState{///若有降级情况,则需要用到CommonState(AbstractState state)public CommonState(AbstractState state) {this.userPoints = state.userPoints;this.stateName = "普通会员";this.account = state.account;this.discount = 1;}public CommonState(clubAccount account) {this.account = account;this.userPoints = 0;this.stateName = "普通会员";this.discount = 1;}@Overridepublic void checkState() {/********** Begin *********/if (userPoints >= 500) {// 升级为黄金会员account.setState(new GoldState(this));// 状态变更后需要重新检查状态(因为可能直接满足VIP条件)account.getState().checkState();}/********** End *********/}
}

3

package step1;
public class GoldState extends AbstractState{public GoldState(AbstractState state) {this.userPoints = state.userPoints;this.stateName = "黄金会员";this.account = state.account;this.discount = 0.95;}@Overridepublic void checkState() {/********** Begin *********/if (userPoints >= 2000) {// 升级为VIP会员account.setState(new VIPState(this));} else if (userPoints < 500) {// 降级为普通会员account.setState(new CommonState(this));}/********** End *********/}
}

4

package step1;
public class clubAccount {private String name;//姓名private AbstractState state;//当前状态public clubAccount(String name) {this.name = name;this.state = new CommonState(this);System.out.println(this.name + "注册成功!");}public void setState(AbstractState state) {this.state = state;}public AbstractState getState() {return this.state;}public void Consume(double money) {/********** Begin *********/state.Consume(money);/********** End *********/}
}

相关新闻

  • 香橙派R2S手搓双宽带聚合指南
  • QTableView 增加Combox
  • 2025中国汽车电子领域领先企业推荐榜单!我国汽车电子领域有哪些领先企业?

最新新闻

  • 中原卖黄金避坑要点,实体店资质辨别教程合扬全程公开鉴价 - 奢侈品交易观察员
  • 用什么方法把照片改为385*441像素?证件照规格调整经验 - 像素测评
  • Gitee Pages迁移与Jekyll博客重生(从零到一实战)
  • 2026年宁波黄金回收门店排行榜top5 鄞州海曙江北靠谱变现门店测评 - 名奢变现站
  • 术语俗话 --- 进程/线程/协程
  • 即梦Seedance 2.0实测指南:节奏锚点、骨骼权重与帧连续性调优

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号