继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

设计模式新解-State模式

小强聊架构
关注TA
已关注
手记 40
粉丝 9455
获赞 241

我们平常设计和编码的时候,经常会想到设计模式,但是怎么把设计模式用好,是个难点,下面作者用一系列文章来讲解下设计模式的用法。本节讲解:State模式

图片描述

使用场景:

我们程序实现的时候,需要不停的进行状态切换,而且这个切换状态比较多,切换的方式没有规律性,那么需要用到State模式。

State和if-elseif 的区别:

一般的状态判断,使用if-elseif 就可以解决,比方下面的例子:

  if(c==1) {
    return "blue";
}else if(c==2) {
    return "red";
}else if(c==3) {
    return "green";
}

另外的一个例子就是:

  if(color.equals("red")) {
            return "blue";
        }else if(color.equals("blue")) {
            return "green";
        }else if(color.equals("green")) {
            return "red";
        }

这种类型,使用if-else if 就可以解决,首先,颜色变化不是很多(只有3种颜色,其次变化顺序固定,red-->blue-->green)
但是试想,如果我们有这样的需求: 要求一共100中颜色之间进行转换,不仅要求从red-->blue,而且要求blue --> red, 那么State模式就是必要的。

State模式的实现方式:

  1. 定义一个State类
package state;
public abstract class State{
   public abstract void forward(Context c);
   public abstract void backward(Context c);
   public abstract String getcolor();
}
  1. 将每个状态定义为一个State子类
package state;

public class BlueState extends State {

public String getcolor(){ 
    return "blue";
}
@Override
public void forward(Context c) {
    // TODO Auto-generated method stub
    c.setState(new GreenState());
}
@Override
public void backward(Context c) {
    // TODO Auto-generated method stub
    c.setState(new RedState());
}
}
  1. 定义Context类
package state;

public class Context {
    private State state = null; 

    public void setState(State state) {
        this.state = state;
    }

    public void forward() {
        state.forward(this);
    }

    public void pull() {
        state.backward(this);
    }
}
  1. 实际调用,只需要通过Context类就可以自行完成状态的转换。
  2. 使用经典案例:
    A. 银行账户状态切换。
    B. TCP Connection 状态切换。
    C. E-Mail里面各种状态的切换。
    D. 各种绘图程序。
打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP