java state用法博客园_状态模式-State Pattern(Java实现)

本文介绍状态模式(State Pattern)的基本概念及其实现方式,并通过一个具体的猛犸象情绪变化的例子展示了如何使用状态模式来改变对象的行为。

状态模式-State Pattern

在状态模式(State Pattern)中,类的行为是基于它的状态改变的。当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。

State接口

表明状态, 实体类是根据状态的变化而发生响应行为的变化的.

/**

* 状态抽象定义

*/

public interface State {

void onEnterState();

void observe();

}

AngryState类

状态的一种实现.

/**

* 生气状态

*/

public class AngryState implements State {

private Mammoth mammoth;

public AngryState(Mammoth mammoth) {

this.mammoth = mammoth;

}

@Override

public void observe() {

System.out.printf("%s 处于暴躁状态!\n", mammoth);

}

@Override

public void onEnterState() {

System.out.printf("%s 开始生气了!\n", mammoth);

}

}

PeacefulState类

状态的一种实现.

/**

* 平静状态

*/

public class PeacefulState implements State {

private Mammoth mammoth;

public PeacefulState(Mammoth mammoth) {

this.mammoth = mammoth;

}

@Override

public void observe() {

System.out.printf("%s 现在很平静.\n", mammoth);

}

@Override

public void onEnterState() {

System.out.printf("%s 开始冷静下来了.\n", mammoth);

}

}

Mammoth类

本类是状态State的持有者

/**

* 猛犸大象

*/

public class Mammoth {

private State state;

public Mammoth() {

state = new PeacefulState(this);

}

public void timePasses() {

if (state.getClass().equals(PeacefulState.class)) {

changeStateTo(new AngryState(this));

} else {

changeStateTo(new PeacefulState(this));

}

}

private void changeStateTo(State newState) {

this.state = newState;

this.state.onEnterState();

}

public void observe() {

this.state.observe();

}

@Override

public String toString() {

return "猛犸大象";

}

}

Main

用于模拟场景以及运行代码

public class Main {

public static void main(String[] args) {

Mammoth mammoth = new Mammoth();

// 看看大象现在是什么状态

mammoth.observe();

// 过了一会儿

mammoth.timePasses();

// 看看大象现在是什么状态

mammoth.observe();

// 过了一会儿

mammoth.timePasses();

// 看看大象现在是什么状态

mammoth.observe();

}

}

运行结果如下:

44cb7c55c06361a5053d60f8f3b24583.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值