状态模式是一种行为设计模式, 允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。状态模式的核心是状态与行为绑定,不同的状态对应不同的行为。
设计模式,一定要敲代码理解
状态行为抽象
java
//在某种状态下,能做什么事情。
public interface State {
void play();
void study();
void battle();
}
状态行为实现
java
/**
* @author ggbond
* @date 2024年04月17日 08:34
* 猪猪侠 正常状态
*/
public class normalState implements State{
@Override
public void play() {
System.out.println("在望子成龙小学,与同学玩耍");
}
@Override
public void study() {
System.out.println("在望子成龙小学,认真学习");
}
@Override
public void battle() {
System.out.println("无战斗技能");
}
}
java
/**
* @author ggbond
* @date 2024年04月17日 08:35
* 猪猪侠 吃超级棒棒糖后的状态
*/
public class lollipopsState implements State{
@Override
public void play() {
System.out.println("不玩耍");
}
@Override
public void study() {
System.out.println("学习效率提升300%");
}
@Override
public void battle() {
System.out.println("释放:降猪十八掌");
}
}
上下文
java
/**
* @author ggbond
* @date 2024年04月17日 08:29
*/
public class Context {
private State state;
public void play(){
this.state.play();
}
public void study(){
this.state.study();
}
public void battle(){
this.state.battle();
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
}
测试与结果
java
/**
* @author ggbond
* @date 2024年04月17日 08:43
*/
public class Main {
public static void main(String[] args) {
Context context = new Context(); // 新建一个上下文
context.setState(new normalState()); // 设置当前状态
context.play();
context.study();
context.battle();// 调用行为
System.out.println("===============");
context.setState(new lollipopsState());
context.play();
context.study();
context.battle();// 调用行为
}
}
总结
满足单一职责原则, 开闭原则。 无需修改已有状态类和上下文就能引入新状态。状态模式在处理具有多种状态和状态转换的对象时非常有用,可以提高代码的质量和可维护性。
java
在望子成龙小学,与同学玩耍
在望子成龙小学,认真学习
无战斗技能
===============
不玩耍
学习效率提升300%
释放:降猪十八掌