Java 设计模式 - 状态模式

发布于 2024-08-08 07:59:42 字数 4460 浏览 22 评论 0

状态模式 (State): 当对象的状态改变时,同时改变其行为,设计思想是把不同状态的逻辑分离到不同的状态类中,从而使得增加新状态更容易;

状态模式的实现关键在于状态转换。简单的状态转换可以直接由调用方指定,复杂的状态转换可以在内部根据条件触发完成。

状态模式经常用在带有状态的对象

实现

定义几种状态

/**
* 用户状态
*/
public enum UserStatus {

ONLINE, OFFLINE, BUSY

}

定义用户对象

/**
* 用户
*/
public class User {

private String name;

private UserStatus userStatus;

public User(String name) {
this.name = name;
//默认在线
userStatus = UserStatus.ONLINE;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public UserStatus getUserStatus() {
return userStatus;
}

public void setUserStatus(UserStatus userStatus) {
this.userStatus = userStatus;
}
}

定义不同状态时的处理

/**
* 状态
*/
public interface State {

/**
* 初始化
*/
void init();

/**
* 回复消息
* @param message
*/
Boolean reply(String message);

}


/**
* 在线状态
*/
public class OnlineState implements State {

@Override
public void init() {
System.out.println("我在线上");
}

@Override
public Boolean reply(String message) {
System.out.println("收到消息: " + message);
return Boolean.TRUE;
}
}


/**
* 离线状态
*/
public class OfflineState implements State {
@Override
public void init() {
System.out.println("我已下线");
}

@Override
public Boolean reply(String message) {
return null;
}
}


/**
* 忙碌状态
*/
public class BusyState implements State{
@Override
public void init() {
System.out.println("我正忙");
}

@Override
public Boolean reply(String message) {
System.out.println("我正忙,稍后回复你的消息: " + message);
return Boolean.FALSE;
}
}

定义用于切换状态的上下文

/**
* 状态切换上下文
*/
public class StateContext {

public static State updateState(UserStatus userStatus) {
//这个是 Java14 的写法,Java8 的话老老实实写 if/else 吧
State state = switch (userStatus) {
case BUSY -> new BusyState();
case ONLINE -> new OnlineState();
case OFFLINE -> new OfflineState();
};
state.init();
return state;
}
}

测试

public class StateTest {

public static void main(String[] args) {
User user = new User("张三");

State state = StateContext.updateState(user.getUserStatus());
state.reply("你好");

//切换到忙碌状态
System.out.println("============================");
user.setUserStatus(UserStatus.BUSY);
state = StateContext.updateState(user.getUserStatus());
state.reply("你好");

//切换到离线状态
System.out.println("============================");
user.setUserStatus(UserStatus.OFFLINE);
state = StateContext.updateState(user.getUserStatus());
state.reply("你好");

}

}

//输出
我在线上
收到消息: 你好
============================
我正忙
我正忙,稍后回复你的消息: 你好
============================
我已下线

所以状态模式的核心是定义一个上下文,根据传递对象的不同状态,切换不同处理(行为),后续加入新的状态,再新增对应状态的处理逻辑(行为) 即可

状态模式可以使用枚举定义 value 的方式,逐级加 1 以便进入下个状态

public enum Step {
DOUGH(4), ROLLED(1), SAUCED(1), CHEESED(2),
TOPPED(5), BAKED(2), SLICED(1), BOXED(0);
int effort;// Needed to get to the next step

Step(int effort) {
this.effort = effort;
}

Step forward() {
if (equals(BOXED)) return BOXED;
return values()[ordinal() + 1];
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

拔了角的鹿

暂无简介

文章
评论
27 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文