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:
上一个频道
下一个频道
下一个调频
声音变大
关机中,淡定不动
阅读全文
1 0
- java设计模式——状态模式
- Java 设计模式——状态模式
- Java设计模式——状态模式
- Java 设计模式——状态模式
- Java设计模式——状态模式
- JAVA设计模式—状态模式(State)
- Java设计模式—状态模式
- java设计模式—状态模式
- 设计模式—状态模式
- 设计模式—状态模式
- java设计模式——状态设计模式
- Java设计模式(10) —— 状态
- 设计模式——状态设计模式
- JAVA设计模式——状态模式(State)
- java设计模式20——状态模式(State)
- 设计模式之状态模式java ——购物
- JAVA设计模式(二十一)——状态模式
- Java设计模式——状态模式(State)
- JAVA学习---1
- AVFoundation录制视频
- JAVA中三種URL连接实体
- BottomNavigationBar的使用
- Matlab实现高斯白噪声
- Java设计模式——状态模式
- CentOS 6.4下编译安装MySQL 5.6.14
- UEditor在线编辑器配置及注意事项
- 似此星辰非昨夜 为谁风露立中宵
- MSVCRTD.lib(crtexew.obj) : error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
- day08-响应数据
- Getuch applies privacy instructions
- java 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/n(利用指针函数)
- Java