一、简介
1、定义
状态模式 (state pattern)是一种行为型设计模式,允许对象在内部状态改变时改变它的行为。通过定义状态接口和具体状态类,将对象的状态和行为分开,使得状态改变时可以改变行为。
2、状态模式的结构
状态模式涉及以下几个角色:
state(状态接口):定义了状态类的共同接口,所有具体的状态类都实现这个接口。
concretestate(具体状态类):每个具体的状态类实现了state接口,并定义了在该状态下的具体行为。
context(上下文):上下文类维护一个当前状态的引用,它通常会委托给具体的状态类来执行相应的状态切换。
二、java实现案例
1、电灯开关状态案例
/**
* @description: 状态接口
* @date: 2025-02-07 17:09
* @author: gaoyufei
**/
public interface state {
void handle(switch context);
}
/**
* @description: 关灯状态
* @date: 2025-02-07 17:12
* @author: gaoyufei
**/
public class closestate implements state{
@override
public void handle(switch switcher) {
switcher.setstate(new openstate());
system.out.println("开灯了");
}
}
/**
* @description: 开灯状态
* @date: 2025-02-07 17:11
* @author: gaoyufei
**/
public class openstate implements state{
@override
public void handle(switch switcher) {
switcher.setstate(new closestate());
system.out.println("关灯了");
}
}
/**
* @description: 开关,持有灯的状态
* @date: 2025-02-07 17:08
* @author: gaoyufei
**/
public class switch {
private state state;
public switch(state state){
this.state=state;
}
public void setstate(state state){
this.state=state;
}
public void press(){
state.handle(this);
}
}
/**
* @description: 操作人
* @date: 2025-02-07 17:14
* @author: gaoyufei
**/
public class operator {
public static void main(string[] args) throws interruptedexception {
switch switcher=new switch(new closestate());//初始状态是关灯
//模拟每隔1秒按压一下开关
while (true){
thread.sleep(1000);
switcher.press();
}
}
}
2、番茄工作法状态案例
/**
* @description: 番茄状态接口
* @date: 2025-02-08 10:49
* @author: gaoyufei
**/
public interface tomatostate {
void deal(worker worker);
}
/**
* @description: 番茄-工作状态类
* @date: 2025-02-08 10:51
* @author: gaoyufei
**/
public class worktomatostate implements tomatostate {
@override
public void deal(worker worker) {
system.out.println("休息结束了,开始工作吧");
try {
thread.sleep(25*60*1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println("工作了25分钟");
worker.settomatostate(new resttomatostate());
}
}
/**
* @description: 番茄-休息状态类
* @date: 2025-02-08 10:53
* @author: gaoyufei
**/
public class resttomatostate implements tomatostate{
@override
public void deal(worker worker) {
system.out.println("工作结束了,好好休息吧");
try {
thread.sleep(5*60*1000);
} catch (interruptedexception e) {
e.printstacktrace();
}
system.out.println("休息了5分钟");
worker.settomatostate(new worktomatostate());
}
}
/**
* @description: 工作者
* @date: 2025-02-08 10:51
* @author: gaoyufei
**/
public class worker {
private tomatostate tomatostate;
public worker(tomatostate tomatostate){
this.tomatostate=tomatostate;
}
public void settomatostate(tomatostate tomatostate){
this.tomatostate=tomatostate;
}
public void starttomatoclock(){
this.tomatostate.deal(this);
}
}
/**
* @description: 客户端
* @date: 2025-02-08 11:02
* @author: gaoyufei
**/
public class client {
public static void main(string[] args) {
worker worker=new worker(new worktomatostate());
while (true){
worker.starttomatoclock();
}
}
}
3、电梯状态案例
这是一个简单的电梯系统。电梯的状态有关门、开门、上升、下降、停止。每个状态下电梯的行为不同。通过状态模式,根据电梯的不同状态执行不同的行为。
/**
* @description: 电梯状态接口
* @date: 2025-02-08 9:02
* @author: gaoyufei
**/
public interface elevatorstate {
void opendoor();
void closedoor();
void moveup();
void movedown();
void stop();
}
/**
* @description: 关门状态
* @date: 2025-02-08 9:05
* @author: gaoyufei
**/
public class closestate implements elevatorstate {
private elevator elevator;
public closestate(elevator elevator){
this.elevator=elevator;
}
@override
public void opendoor() {
system.out.println("电梯门开了");
elevator.setcurrentstate(elevator.getopenstate());
}
@override
public void closedoor() {
system.out.println("电梯门已经关了");
}
@override
public void moveup() {
system.out.println("电梯上升");
elevator.setcurrentstate(elevator.getmovingupstate());
}
@override
public void movedown() {
system.out.println("电梯下降");
elevator.setcurrentstate(elevator.getmovingdownstate());
}
@override
public void stop() {
system.out.println("电梯停止");
elevator.setcurrentstate(elevator.getstopstate());
}
}
/**
* @description: 开门状态
* @date: 2025-02-08 9:07
* @author: gaoyufei
**/
public class openstate implements elevatorstate{
private elevator elevator;
public openstate(elevator elevator){
this.elevator=elevator;
}
@override
public void opendoor() {
system.out.println("电梯门已经打开");
}
@override
public void closedoor() {
system.out.println("电梯门关了");
elevator.setcurrentstate(elevator.getclosestate());
}
@override
public void moveup() {
system.out.println("电梯门打开状态,不能上升");
}
@override
public void movedown() {
system.out.println("电梯门打开状态,不能下降");
}
@override
public void stop() {
system.out.println("电梯门打开状态,不能变换为停止状态");
}
}
/**
* @description: 停止状态
* @date: 2025-02-08 9:59
* @author: gaoyufei
**/
public class stopstate implements elevatorstate{
private elevator elevator;
public stopstate(elevator elevator){
this.elevator=elevator;
}
@override
public void opendoor() {
system.out.println("电梯门开了");
elevator.setcurrentstate(elevator.getopenstate());
}
@override
public void closedoor() {
system.out.println("电梯门关了");
elevator.setcurrentstate(elevator.getclosestate());
}
@override
public void moveup() {
system.out.println("电梯上升");
elevator.setcurrentstate(elevator.getmovingupstate());
}
@override
public void movedown() {
system.out.println("电梯下降");
elevator.setcurrentstate(elevator.getmovingdownstate());
}
@override
public void stop() {
system.out.println("电梯停止");
}
}
/**
* @description: 上升状态
* @date: 2025-02-08 9:07
* @author: gaoyufei
**/
public class movingupstate implements elevatorstate{
private elevator elevator;
public movingupstate(elevator elevator){
this.elevator=elevator;
}
@override
public void opendoor() {
system.out.println("电梯正在上升,不能开门");
}
@override
public void closedoor() {
system.out.println("电梯已经关门");
}
@override
public void moveup() {
system.out.println("电梯正在上升");
}
@override
public void movedown() {
system.out.println("电梯下降");
elevator.setcurrentstate(elevator.getmovingdownstate());
}
@override
public void stop() {
system.out.println("电梯停止");
elevator.setcurrentstate(elevator.getstopstate());
}
}
/**
* @description: 下降状态
* @date: 2025-02-08 9:08
* @author: gaoyufei
**/
public class movingdownstate implements elevatorstate{
private elevator elevator;
public movingdownstate(elevator elevator){
this.elevator=elevator;
}
@override
public void opendoor() {
system.out.println("电梯正在下降,不能开门");
}
@override
public void closedoor() {
system.out.println("电梯正在下降,已经关门了");
}
@override
public void moveup() {
system.out.println("电梯上升");
elevator.setcurrentstate(elevator.getmovingupstate());
}
@override
public void movedown() {
system.out.println("电梯正在下降");
}
@override
public void stop() {
system.out.println("电梯停止");
elevator.setcurrentstate(elevator.getstopstate());
}
}
/**
* @description: 电梯
* @date: 2025-02-08 9:04
* @author: gaoyufei
**/
public class elevator {
private elevatorstate closestate;
private elevatorstate openstate;
private elevatorstate movingdownstate;
private elevatorstate movingupstate;
private elevatorstate stopstate;
private elevatorstate currentstate;
public elevator(){
closestate=new closestate(this);
openstate=new openstate(this);
movingdownstate=new movingdownstate(this);
movingupstate=new movingupstate(this);
stopstate=new stopstate(this);
currentstate=closestate;// 默认初始状态为关闭状态
}
public void setcurrentstate(elevatorstate currentstate) {
this.currentstate = currentstate;
}
public elevatorstate getclosestate() {
return closestate;
}
public elevatorstate getopenstate() {
return openstate;
}
public elevatorstate getmovingdownstate() {
return movingdownstate;
}
public elevatorstate getmovingupstate() {
return movingupstate;
}
public elevatorstate getstopstate() {
return stopstate;
}
public void opendoor(){
currentstate.opendoor();
}
public void closedoor(){
currentstate.closedoor();
}
public void moveup(){
currentstate.moveup();
}
public void movedown(){
currentstate.movedown();
}
public void stop(){
currentstate.stop();
}
}
/**
* @description: 客户端
* @date: 2025-02-08 9:29
* @author: gaoyufei
**/
public class client {
public static void main(string[] args) {
//初始关闭状态
elevator elevator=new elevator();
//关门
elevator.closedoor();//输出 电梯门已经关了
//开门
elevator.opendoor();//输出 电梯门开了
//上升
elevator.moveup();//输出 电梯门打开状态不能上升
//关门
elevator.closedoor();//输出 电梯门关了
//上升
elevator.moveup();//输出 电梯上升
//关门
elevator.closedoor();//输出 电梯已经关门
//下降
elevator.movedown();//输出 电梯下降
//停止
elevator.stop();//输出 电梯停止
//开门
elevator.opendoor();//输出 电梯门开了
//停止
elevator.stop();//输出 电梯门打开状态,不能变换为停止状态
}
}到此这篇关于java实现状态模式的示例代码的文章就介绍到这了,更多相关java 状态模式内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论