亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

設計模式新解-State模式

標簽:
架構

我们平常设计和编码的时候,经常会想到设计模式,但是怎么把设计模式用好,是个难点,下面作者用一系列文章来讲解下设计模式的用法。本节讲解: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. 各种绘图程序。
點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
全棧工程師
手記
粉絲
9452
獲贊與收藏
241

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消