文章目录
- 1、状态模式介绍
- 2、状态模式的定义
- 3、状态模式的使用场景
- 4、状态模式的UML 类图
- 5、状态模式的简单示例
- 6、代码结构
- 1) TvStateOperate 接口文件
- 2)、PowerOnState 开机状态下操作
- 3)、PowerOffState 关机状态下 操作过程
- 4)、PowerController 电视状态设定接口
- 5)、TvController 设定电视状态 传递参数
- 6、 MainActivity 文件
- 7)、log 打印
1、状态模式介绍
状态模式的行为是由状态决定的,不同的状态有不同的行为。
2、状态模式的定义
当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。
3、状态模式的使用场景
(1)一个对象的行为取决于他的状态,并且它必须在运行时根据状态来改变行为。
(2)代码中包含了大量与对象有关的语句,if-else switch-case
4、状态模式的UML 类图
1)、Context:环境类,定义客户感兴趣的接口,维护一个State 子类的实例,这个实例定义了对象的当前状态。
2)State: 抽象状态类,或者状态接口,定义一个或者一组接口,表示该状态下的行为。
3)ConcreteStateA、ConcreteStateB: 具体状态类,每一个具体的状态类实现抽State 中定义的接口,从而达到不同状态下的不同行为。
5、状态模式的简单示例
我们就以电视遥控器为例来演示状态模式的实现,我们简单将电视的状态分为:
开机状态 、 关机状态
再 开机状态 下通过遥控器进行 频道的切换、调整音量等都是有效的。
在 关机状态 下通过遥控器进行 频道的切换、调整音量等都是无效的。
6、代码结构
1)TvStateOperate 接口,定义了对遥控器的操作方法
2)PowerOnState 添加 TvStateOperate 接口,复写 电视打开状态下的操作方法
3)PowerOffState 添加 TvStateOperate 接口,复写 电视关闭状态下的操作方法
4)PowerController 接口,定义了对电视状态的设定 开机 、 关机
5)TvController 添加 PowerController 接口,对电视状态进行 设定,传递 状态参数
6)MainActivity 对电视进行操作
1) TvStateOperate 接口文件
package com.example.ubuntu.mystateinterface;
//电视状态接口,定义了电视操作的函数
public interface TvStateOperate {
public void nextChannel();
public void prevChannel();
public void turnUp();
public void turnDown();
}
2)、PowerOnState 开机状态下操作
package com.example.ubuntu.mystateinterface;
import android.util.Log;
public class PowerOnState implements TvStateOperate {
private String TAG = "PowerOnState: ";
@Override
public void nextChannel() {
Log.i(TAG,"前往下一频道");
}
@Override
public void prevChannel() {
Log.i(TAG,"前往上一频道");
}
@Override
public void turnUp() {
Log.i(TAG,"不可用 电视已经是打开状态");
}
@Override
public void turnDown() {
Log.i(TAG,"关闭电视");
}
}
3)、PowerOffState 关机状态下 操作过程
package com.example.ubuntu.mystateinterface;
import android.util.Log;
//关机状态,此时只有开机的功能可以使用
public class PowerOffState implements TvStateOperate {
private String TAG = "PowerOffState: ";
@Override
public void nextChannel() {
Log.i(TAG,"下一频道不可用");
}
@Override
public void prevChannel() {
Log.i(TAG,"前一频道不可用");
}
@Override
public void turnUp() {
Log.i(TAG,"电视打开");
}
@Override
public void turnDown() {
Log.i(TAG,"不可用电视已经是关闭状态");
}
}
4)、PowerController 电视状态设定接口
package com.example.ubuntu.mystateinterface;
public interface PowerController {
public void powerOn();
public void powerOff();
}
5)、TvController 设定电视状态 传递参数
package com.example.ubuntu.mystateinterface;
import android.util.Log;
public class TvController implements PowerController {
private String TAG = "TvController: ";
private TvStateOperate tvStateOperate;
public void setTvState(TvStateOperate tvState){
this.tvStateOperate = tvState;
}
@Override
public void powerOn() {
setTvState(new PowerOnState());
Log.i(TAG,"开机了");
}
@Override
public void powerOff() {
setTvState(new PowerOffState());
Log.i(TAG,"关机了");
}
public void nextChannel(){
tvStateOperate.nextChannel();
}
public void preChannel(){
tvStateOperate.prevChannel();
}
public void turnUp(){
tvStateOperate.turnUp();
}
public void turnDown(){
tvStateOperate.turnDown();
}
}
6、 MainActivity 文件
package com.example.ubuntu.mystateinterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity: ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TvController tvController = new TvController();
tvController.powerOn(); //设置开机状态
tvController.nextChannel();//下一频道
tvController.preChannel();//前一频道
tvController.turnUp(); //开机
tvController.turnDown(); //关机
tvController.powerOff();//设置关机状态
tvController.nextChannel();//下一频道
tvController.preChannel();//前一频道
tvController.turnDown(); //关机
tvController.turnUp(); //开机
}
}
7)、log 打印
文献参考:
Android 源码设计模式解析与实战 第二版
本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。