Java设计模式——状态模式

来源:互联网 发布:c 把数据生成html文件 编辑:程序博客网 时间:2024/05/17 23:32

        状态模式,顾名思义,在不同的状态有不通的行为,比如我们常用的新浪微博,当点击分享按钮时,如果是登录状态,则跳入分享输入界面,如果是未登录状态,则跳入登录页面。


        这里我们用一个简单的例子说明一下状态模式,电视机,分为开、关两种状态,如果正常写代码:


public class TVController {    private static final String TAG = "TVController";    private static final int POWER_ON = 0x010;    private static final int POWER_OFF = 0x011;    private static int CURRENT_POWER;    public void setPowerOn() {        CURRENT_POWER = POWER_ON;        Log.e(TAG, "开机!");    }    public void setPowerOff() {        CURRENT_POWER = POWER_OFF;        Log.e(TAG, "关机!");    }    public void nextChannel() {        if (CURRENT_POWER == POWER_ON)            Log.e(TAG, "下一个频道");        else            Log.e(TAG, "关机中,淡定不动");    }    public void preChannel() {        if (CURRENT_POWER == POWER_ON)            Log.e(TAG, "上一个频道");        else            Log.e(TAG, "关机中,淡定不动");    }}

现在只有上一个频道和下一个频道,如果还有十几种功能呢?难道要不停地写if(CURRTNT_POWER==POWER_ON)....  else...  几十种呢?那不得累死!

再如果除了开机和关机,还有第三种状态呢?每个方法都需要加上if...else...  听着就累了吧!

状态模式实现就比较简单,降低耦合性的同时,使代码通俗易懂,而且方便后期维护代码:


首先写一个接口,实现电视机的状态功能:

public interface TVState {    void nextChannel();    void preChannel();    void turnUp();    void turnDown();}

下面添加一个开机状态:
public class TurnOnState implements TVState {    public static final String TAG = "TurnOnState";    @Override    public void nextChannel() {        Log.e(TAG, "下一个频道");    }    @Override    public void preChannel() {        Log.e(TAG, "上一个频道");    }    @Override    public void turnUp() {        Log.e(TAG, "声音变大");    }    @Override    public void turnDown() {        Log.e(TAG, "声音变小");    }}


再来一个关机状态:


public class TurnOffState implements TVState {    public static final String TAG = "TurnOffState";    @Override    public void nextChannel() {        Log.e(TAG, "关机中,淡定不动");    }    @Override    public void preChannel() {        Log.e(TAG, "关机中,淡定不动");    }    @Override    public void turnUp() {        Log.e(TAG, "关机中,淡定不动");    }    @Override    public void turnDown() {        Log.e(TAG, "关机中,淡定不动");    }}

这时老板说了,智能电视机,又新加了一种收音机状态,只有声音没有画面,可以闭着眼睛享受,so easy:


public class BroadcastState implements TVState {    public static final String TAG = "BroadcastState";    @Override    public void nextChannel() {        Log.e(TAG, "上一个调频");    }    @Override    public void preChannel() {        Log.e(TAG, "下一个调频");    }    @Override    public void turnUp() {        Log.e(TAG, "声音变大");    }    @Override    public void turnDown() {        Log.e(TAG, "声音变小");    }}


使用起来也非常简单:

TVState state = new TurnOnState();        state.nextChannel();        state.preChannel();        state = new BroadcastState();
        state.nextChannel();
  state.turnUp();

state = new TurnOnState();
  state.turnDown();


log:


上一个频道

下一个频道

下一个调频

声音变大

关机中,淡定不动
 
原创粉丝点击