状态模式
- 概述:允许一个对象在其内部状态改变时改变他的行为.对象看起来似乎修改了它的类
- 帮助理解:可以将状态模式的场景理解为QQ的状态,不同的状态对于他的QQ好友来说,行为是不一样的.例如:隐身状态对于好友来说不可见.总结下来状态模式就有两个要点:1.可以通过改变状态来获得不同的行为.2.对象看起来有所变化(在例子中可以理解为,你的好友可以看到你的变化)
- 使用场景:对象的行为依赖于他的状态.并且可以根据它的状态改变而改变相应的行为.
- 状态模式所包含的角色
- Context : 上下文环境类,他维护了一个具体状态对象,并将与状态相关的操作委托给当前的具体状态对象来处理
- State : 抽象状态.定义一个抽象方法来封装使用上下文环境中的一个特定状态相关的行为.
- ConcreteState : 具体状态.实现抽象类定义的抽象方法.
- 优点
- 封装了转换规则
- 将所有与某个状态有关的行为放到一个类中.并且可以方便的增加新的状态.这样只需要改变对象的状态就可改变对象的行为
- 缺点
- 会增加系统类和对象的个数
- 状态模式的结构和实现会比较复杂,使用不当的话会导致结构和代码混乱
代码实现
示例:根据QQ状态(在线,隐身等),以及不同状态下的不同行为.使用状态模式演示这一场景.
上下文环境类
package State;
/**
* Created by looper on 2017/8/24.
*/
public class Context {
private State state;
public Context(State state){
this.state = state;
}
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
System.out.print("当前状态是 :"+state.getStateName());
if(StateName.CLOAKING.equals(state.getStateName())){
System.out.println(" 对好友不可见.");
}else{
System.out.println(" 对好友可见.");
}
}
public void changeState(){
this.state.changeState(this);
}
}
状态枚举类
package State;
/**
* Created by looper on 2017/8/24.
*/
public enum StateName {
//隐身状态,在线状态
CLOAKING,ONLINE;
@Override
public String toString(){
return this.name();
}
}
抽象状态类
package State;
/**
* Created by looper on 2017/8/24.
*/
public abstract class State {
private StateName stateName;
public abstract void changeState(Context context);
public State(StateName stateName){
this.stateName = stateName;
}
public StateName getStateName() {
return stateName;
}
public void setStateName(StateName stateName) {
this.stateName = stateName;
}
}
具体状态类(在线状态)
package State;
/**
* Created by looper on 2017/8/24.
*/
public class OnlineState extends State {
public OnlineState(StateName stateName) {
super(stateName);
}
@Override
public void changeState(Context context) {
//转换为隐身状态
context.setState(new CloakingState(StateName.CLOAKING));
}
}
具体状态类(隐身状态)
package State;
/**
* Created by looper on 2017/8/24.
*/
public class CloakingState extends State {
public CloakingState(StateName stateName) {
super(stateName);
}
@Override
public void changeState(Context context) {
//转换为在线状态
context.setState(new OnlineState(StateName.ONLINE));
}
}
测试类
package State;
/**
* Created by looper on 2017/8/24.
*/
public class StateTest {
public static void main(String[] args) {
//初始状态 为 在线状态
Context context = new Context(new OnlineState(StateName.ONLINE));
context.changeState();
context.changeState();
}
}
输出:
我将23种设计模式的全部代码上传到CSDN,有用得到的同学 可以去下载.
下载地址 : 点我