定义
状态模式中的行为是由状态来决定,不同的状态下有不同的行为。当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
Android 中源码使用状态模式
- 登录系统,根据用户是否登录,判断事件的处理方式。
- Wi-Fi管理,在不同的状态下,WiFi的扫描请求处理不一。
特点
-
优点
将所有与一个特定的状态相关的行为都放入一个状态对象中,它提供了一个更好的方法来组织与特定状态相关的代码,将繁琐的状态判断转换成结构清晰的状态类族,在避免代码膨胀的同时也保证了可扩展性与可维护性。 -
缺点
状态模式的使用必然会增加系统类和对象的个数。
使用场景
1.一个对象的行为取决于它的状态,并且它必须在运行时根据状态改变它的行为。
2.代码中包含大量与对象状态有关的条件语句,例如,一个操作中含有大量的多分支语句,且这些分支依赖于该对象的状态。
简单实现
需求:首先将电视的状态分为开机与关机状态,开机时可以通过遥控器实现频道切换和调节音量,但是关机时,这些操作都会失效。
/**
* Created on 2019/4/4 09:29
* 电视状态接口
* @author Scarf Gong
*/
public interface TVState {
void nextChannel();
void prevChannel();
void turnUp();
void turnDown();
}
---------------------------
/**
* Created on 2019/4/4 09:40
* 关机状态
* @author Scarf Gong
*/
public class PowerOffState implements TVState {
@Override
public void nextChannel() {
}
@Override
public void prevChannel() {
}
@Override
public void turnUp() {
}
@Override
public void turnDown() {
}
}
---------------------------
/**
* Created on 2019/4/4 09:41
* 开机状态
* @author Scarf Gong
*/
public class PowerOnState implements TVState {
@Override
public void nextChannel() {
Log.d("TAG", "下一个频道");
}
@Override
public void prevChannel() {
Log.d("TAG", "上一个频道");
}
@Override
public void turnUp() {
Log.d("TAG", "调高声音");
}
@Override
public void turnDown() {
Log.d("TAG", "调低声音");
}
}
/**
* Created on 2019/4/4 09:45
* 电源操作接口
* @author Scarf Gong
*/
public interface PowerController {
void powerOn();
void powerOff();
}
---------------------------------
/**
* Created on 2019/4/4 09:46
* 遥控器
* @author Scarf Gong
*/
public class TVController implements PowerController {
private TVState mState;
public void setState(TVState state) {
mState = state;
}
@Override
public void powerOn() {
setState(new PowerOnState());
Log.d("TAG", "开机了");
}
@Override
public void powerOff() {
setState(new PowerOffState());
Log.d("TAG", "关机了");
}
public void nextChannel() {
mState.nextChannel();
}
public void preChannel() {
mState.prevChannel();
}
public void turnUp() {
mState.turnUp();
}
public void turnDown(){
mState.turnDown();
}
}
使用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
TVController controller = new TVController();
controller.powerOn(); //开机了
controller.nextChannel(); //下一个频道
controller.turnDown(); //调低声音
controller.powerOff(); //关机了
controller.turnUp(); //无效
}
}
结果:
2019-04-04 09:53:44.53 D/TAG: 开机了
2019-04-04 09:53:44.53 D/TAG: 下一个频道
2019-04-04 09:53:44.53 D/TAG: 调低声音
2019-04-04 09:53:44.53 D/TAG: 关机了
网友评论