设计模式之状态模式
Posted 回归心灵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之状态模式相关的知识,希望对你有一定的参考价值。
定义
当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。
通用类图
具体实现
状态模式主要是当对象的内在状态变化时,其行为也随之改变。封装了状态的变化,在使用方看来就好像改变了其类一样。下面就来看看具体的实现。
抽象状态角色 State,负责定义对象的状态,并且封装环境角色实现状态的切换。
package com.yrs.state;
/**
* @Author: yangrusheng
* @Description: 抽象状态角色
* @Date: Created in 17:11 2020/8/23
* @Modified By:
*/
public abstract class State
// 供子类访问,调用相关方法
protected Context context;
public void setContext(Context context)
this.context = context;
// 行为1
public abstract void handle1();
//行为2
public abstract void handle2();
具体状态角色 ConcreteState,具体状态角色要完成两件事,一是本状态下的行为处理。二是状态转换时的处理。
package com.yrs.state;
/**
* @Author: yangrusheng
* @Description: 具体状态
* @Date: Created in 17:13 2020/8/23
* @Modified By:
*/
public class ConcreteState1 extends State
@Override
public void handle1()
// 该状态下所要做的事
System.out.println("concrete state1 execute handle1");
@Override
public void handle2()
// 状态改变,执行对应状态动作
super.context.setCurrentState(Context.STATE2);
super.context.handle2();
package com.yrs.state;
/**
* @Author: yangrusheng
* @Description: 具体状态
* @Date: Created in 17:13 2020/8/23
* @Modified By:
*/
public class ConcreteState2 extends State
@Override
public void handle1()
// 状态变化,执行相应状态的动作
super.context.setCurrentState(Context.STATE1);
super.context.handle1();
@Override
public void handle2()
// 该状态下所要做的事
System.out.println("concrete state2 execute handle2");
环境角色 Context: 定义客户端所需要的接口,并且负责具体状态的转换,把对应的行为动作委托给当前状态执行。
package com.yrs.state;
/**
* @Author: yangrusheng
* @Description: 环境上下文角色
* @Date: Created in 17:14 2020/8/23
* @Modified By:
*/
public class Context
// 所有状态
public final static State STATE1 = new ConcreteState1();
public final static State STATE2 = new ConcreteState2();
// 当前状态
private State currentState;
public State getCurrentState()
return currentState;
public void setCurrentState(State currentState)
// 切换状态
this.currentState = currentState;
// 和当前状态建立联系
this.currentState.setContext(this);
// 行为委托
public void handle1()
this.currentState.handle1();
public void handle2()
this.currentState.handle2();
客户端 Client:
package com.yrs.state;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 18:11 2020/8/23
* @Modified By:
*/
public class Client
public static void main(String[] args)
// 定义环境上下文
Context context = new Context();
// 初始状态
context.setCurrentState(new ConcreteState1());
context.handle1();
context.handle2();
源代码:https://github.com/ByrsH/Design-Patterns/tree/master/Design%20Patterns/src/main/java/com/yrs/state
状态模式的应用
状态模式的优点:
- 结构清晰。避免过多的条件语句判断,避免使程序变得复杂,提高了系统的可维护性
- 遵循设计原则。很好地体现了开闭原则和单一职责原则,每个状态对应一个类。
- 封装性非常好。状态的变换放在类的内部来实现,外部不需要知道内部是如何实现的。
缺点:
如果状态多的话,会造成类膨胀
使用场景
- 行为随着状态改变而改变的场景
- 条件、分支判断语句的替代者
参考
- 《设计模式之禅-第2版》
以上是关于设计模式之状态模式的主要内容,如果未能解决你的问题,请参考以下文章