设计模式:状态模式示例

news/2024/9/25 0:16:19/

状态模式可以应用于多种场景,下面是一些示例及其代码实现:

1. 交通信号灯

交通信号灯(红灯、绿灯、黄灯)根据当前状态切换到下一个状态。

java">// 状态接口
interface TrafficLightState {void change(TrafficLight trafficLight);
}// 具体状态:红灯
class RedLight implements TrafficLightState {public void change(TrafficLight trafficLight) {System.out.println("红灯 - 请等待");trafficLight.setState(new GreenLight());}
}// 具体状态:绿灯
class GreenLight implements TrafficLightState {public void change(TrafficLight trafficLight) {System.out.println("绿灯 - 请通过");trafficLight.setState(new YellowLight());}
}// 具体状态:黄灯
class YellowLight implements TrafficLightState {public void change(TrafficLight trafficLight) {System.out.println("黄灯 - 请小心");trafficLight.setState(new RedLight());}
}// 上下文
class TrafficLight {private TrafficLightState state;public TrafficLight(TrafficLightState state) {this.state = state;}public void setState(TrafficLightState state) {this.state = state;}public void change() {state.change(this);}
}// 客户端代码
public class TrafficLightDemo {public static void main(String[] args) {TrafficLight light = new TrafficLight(new RedLight());light.change(); // 输出: 绿灯 - 请通过light.change(); // 输出: 黄灯 - 请小心light.change(); // 输出: 红灯 - 请等待}
}

2. 游戏角色等级系统

游戏中的角色根据经验值提升等级,不同等级有不同的行为。

java">// 状态接口
interface LevelState {void play();void doubleExperience();
}// 具体状态:新手
class NoviceLevel implements LevelState {public void play() {System.out.println("新手玩家 - 正常经验获取");}public void doubleExperience() {System.out.println("新手玩家 - 无法双倍经验");}
}// 具体状态:高手
class MasterLevel implements LevelState {public void play() {System.out.println("高手玩家 - 高速经验获取");}public void doubleExperience() {System.out.println("高手玩家 - 双倍经验获取");}
}// 上下文
class Player {private LevelState levelState;public Player(LevelState levelState) {this.levelState = levelState;}public void upgradeLevel(LevelState levelState) {this.levelState = levelState;}public void play() {levelState.play();}public void doubleExperience() {levelState.doubleExperience();}
}// 客户端代码
public class GameDemo {public static void main(String[] args) {Player player = new Player(new NoviceLevel());player.play(); // 输出: 新手玩家 - 正常经验获取player.doubleExperience(); // 输出: 新手玩家 - 无法双倍经验// 玩家升级player.upgradeLevel(new MasterLevel());player.play(); // 输出: 高手玩家 - 高速经验获取player.doubleExperience(); // 输出: 高手玩家 - 双倍经验获取}
}

这两个示例展示了状态模式在不同场景下的应用。在第一个示例中,交通信号灯根据当前状态变化到下一个状态;在第二个示例中,游戏角色根据等级状态拥有不同的行为。状态模式使得状态的变化更加灵活和可管理,同时也使得代码更加清晰和易于维护。


http://www.ppmy.cn/news/1427338.html

相关文章

20240417,友元 FRIEND

本来要学习的吃瓜吃了一下午 目录 3.1 全局函数做友元 3.2 友元类 3.3 成员函数做友元 三&#xff0c;友元 3.1 全局函数做友元 #include<iostream> using namespace std; class Building {friend void goodGay(Building* building);//好朋友&#xff0c;可以访问…

将本地项目推送至gitlab仓库

1. gitlab上新建一个空白项目 gitlab上点击new project按钮&#xff0c;新建一个项目 新建空白项目 项目名称与本地新建项目名称相同&#xff0c;其余根据具体需要选择 2. 初始化本地仓库并commit项目 进入本地项目根目录下&#xff0c;右击 git bash here打开命令窗口 初始化…

C语言第六章之内存分布,内存管理

内存分布 C代码编译过程 预处理 宏定义展开、头文件展开、条件编译&#xff0c;这里并不会检查语法 编译 检查语法&#xff0c;将预处理后文件编译生成汇编文件 汇编 将汇编文件生成目标文件(二进制文件) 链接 将目标文件链接为可执行程序 进程的内存分布 程序运行起来(…

Ubuntu22.04下opencv4.9.0环境的搭建

目录 1、更新系统包列表:2、安装依赖项:3、下载 OpenCV 源代码:4、编译和安装 OpenCV:5、配置环境变量:6、测试1、更新系统包列表: 在终端中执行以下命令,以确保系统包列表是最新的: sudo apt update2、安装依赖项: 安装构建 OpenCV 所需的依赖项: sudo apt inst…

怎么用手机远程控制电脑 远程控制怎么用

怎么用手机远程控制电脑&#xff1a;远程控制怎么用 在这个科技日新月异的时代&#xff0c;远程控制电脑已经成为了很多人的需求。有时&#xff0c;我们可能在外出时突然需要访问家中的电脑&#xff0c;或者在工作中需要远程操控办公室的电脑。这时&#xff0c;如果能用手机远…

css层叠性,继承性,优先级

前言 本文概要&#xff1a;讲述css的三大特性&#xff0c;层叠&#xff0c;继承和优先级。 层叠性 描述&#xff1a;我们试想以下这种情况&#xff1a;我们定义了同一个选择器&#xff0c;但是定义的属性不同。属性有相同的也有不同的&#xff0c;那么最后我们这个页面会听谁的…

园区巡检机器人能解决哪些问题?

在当今城市化快速发展的背景下&#xff0c;园区管理成为了城市管理的重要组成部分。然而&#xff0c;随着园区规模的不断扩大和管理需求的日益增加&#xff0c;传统的园区巡检方式已经无法满足对园区安全、环境监测和设施维护的需求。人工巡检存在着效率低、覆盖范围有限、安全…

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型&#xff1a;application/json 响应参数说明&#xff1a; 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…