JAVA开发的23种设计模式之 --- 状态模式

状态模式允许对象在内部状态改变时改变其行为。本文通过QQ状态为例,阐述了不同状态对应的不同行为,如隐身状态使好友不可见。状态模式有两个关键点:1.通过状态切换实现不同行为;2.对象状态的改变对外可见。适用场景为对象行为依赖其状态。模式包括上下文环境类、抽象状态和具体状态。虽然该模式封装了转换规则并易于扩展,但也可能导致系统类和对象数量增加及结构复杂化。作者已将23种设计模式的代码上传至CSDN供下载。
摘要由CSDN通过智能技术生成
状态模式
  • 概述:允许一个对象在其内部状态改变时改变他的行为.对象看起来似乎修改了它的类
  • 帮助理解:可以将状态模式的场景理解为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,有用得到的同学 可以去下载.

下载地址 : 点我



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶孤心丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值