当前位置: 首页 > news >正文

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

第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 *********/}
}

http://www.rkmt.cn/news/68841.html

相关文章:

  • 香橙派R2S手搓双宽带聚合指南
  • QTableView 增加Combox
  • 2025中国汽车电子领域领先企业推荐榜单!我国汽车电子领域有哪些领先企业?
  • 完整教程:Linux学习之旅6
  • Sword B树学习笔记一
  • 2025年五大有实力的电加热导热油炉生产厂家推荐
  • 混频器混频效率低,噪声大,可能是本振信号强度所致
  • Binder机制的优点有哪些?
  • 2025 年 12 月试验机,拉力试验机,高低温拉伸试验机厂家最新推荐,聚焦资质、案例、售后的十家机构深度解读!
  • 2025 年 12 月成都艺术生文化课集训,成都高三冲刺封闭式全托辅导最新推荐,聚焦资质、案例、售后的十家机构深度解读!
  • 2025年卧式LTO沉积设备供货商推荐榜单:Sipos沉积设备/PSG沉积设备/Si3N4沉积设备制造商精选
  • 2025 年北京婚礼堂服务机构最新推荐榜,聚焦品牌服务品质与菜品新鲜度深度解析烟火气宴席北京婚礼堂公司推荐
  • 2025 年 12 月人力资源咨询公司权威推荐榜:精准匹配与专业服务的行业佼佼者!
  • 完整教程:模电基础和数电基础
  • 2025 年 12 月污水处理用水墨分离设备,智能化水墨分离设备厂家最新推荐,聚焦资质、案例、售后的十家机构深度解读!
  • 2025 年 12 月内控管理咨询公司权威推荐榜:精准风控与高效运营的行业领航者
  • 2026年煤炭检测仪器厂家新推荐排行,煤炭检测仪器信誉好/售后好/服务好/技术好
  • 2025 年 12 月驻场咨询公司权威推荐榜:企业转型与管理优化的最佳伙伴!
  • WTAPI框架个人微信机器人可开发功能
  • 推荐一家放心的保研规划:这篇推荐指南请收下!
  • 水中油检测仪器正规供应商TOP5权威推荐:个性化定制优选指南
  • 最值得打卡的十大火锅品牌排行榜出炉,重庆火锅/火锅/美食/特色美食/老火锅/火锅店/川渝火锅火锅品牌排行
  • 2025年12月广州装饰装修公司推荐榜:办公室/厂房/商铺/酒店/会所/美容院/装饰装修/设计装修,匠心筑空间,这三家公司用品质赢得信赖
  • 【IO多路转接】epoll 高性能网络编程:从底层机制到服务器实战 - 教程
  • “骑跑中国” 重庆站开赛,600 组家庭解锁全民健身新赛道
  • 技术强管理规范的源头厂家甄选指南,助力企业降本提效
  • 嘉峪关青少年飞盘赛开赛,100 余名小将默契比拼
  • 第五届北京 BMX 小轮车公开赛收官,青少年展现极限活力
  • Studio 3T 2025.22 发布 - MongoDB 的终极 GUI、IDE 和 客户端
  • 页面适配,高度撑满