状态模式
状态模式属于行为型设计模式
定义:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类
对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为
模式类图
角色:
- 抽象状态接口:
State
定义抽象状态接口 - 具体状态实现:
ConcreteState
实现State
接口,不同状态实现逻辑不同 - 环境类:
Context
持有一个状态实例
看类图就知道这个模式很简单了
优点
- 结构清晰,遵循设计原则,每种状态都对应一个实现类,同一扩展
- 封装性非常好,状态变换放置到环境类的内部来实现
缺点
如果类的成员变量过多,多次保存,会消耗一定的内存
模式代码实现
源码地址:https://github.com/mingyuHub/design-patterns
抽象状态接口
/**
* @auther: chenmingyu
* @date: 2019/3/26 19:42
* @description: 状态接口
*/
public interface Stateable {
/**
* 搞事情
*/
void doSometing();
}
具体状态实现
学习状态
/**
* @author: chenmingyu
* @date: 2019/3/26 19:44
* @description:
*/
public class StudyState implements Stateable{
@Override
public void doSometing() {
System.out.println("学习状态,就要学习");
}
}
游戏状态
/**
* @author: chenmingyu
* @date: 2019/3/26 19:43
* @description: 游戏状态
*/
public class GameState implements Stateable {
@Override
public void doSometing() {
System.out.println("游戏状态,就打游戏");
}
}
环境类
/**
* @author: chenmingyu
* @date: 2019/3/26 19:45
* @description: 环境类
*/
@Data
public class Context {
/**
* 持有具体状态实例
*/
private Stateable stateable;
}
验证
public static void main(String[] args) {
Context context = new Context();
Stateable studyState = new StudyState();
context.setStateable(studyState);
context.getStateable().doSometing();
Stateable gameState = new GameState();
context.setStateable(gameState);
context.getStateable().doSometing();
}
输出
学习状态,就要学习
游戏状态,就打游戏
参考:设计模式之禅:https://www.kancloud.cn/sstd521/design/193607
推荐阅读:23种设计模式详解