状态模式,顾名思义,行为是由状态来决定的,不同的状态下有不同的行为,比如说电视机,当我们按开机键后,频道+,-,音量+、-都可以使用,而当我们按关机键之后除了开机键其他键都不可以使用。这就是一种状态
没图我说个JB...
角色介绍:
Context 环境类,定义客户感兴趣的接口,维护一个State子类的示例,这个实例定义了对象的当前状态;
State 抽象状态类或者状态接口,定义一个或者一组接口,表示该状态下的行为。
ConcreteStateA,ConcreteStateB 具体状态类,每一个具体的状态类实现抽象State中定义的接口,从而达到不同状态下的不同行为
就上面的那个例子,如果不按照状态模式写的话就是这样的
package
Client;
/**
* 不按照状态模式写
* 电视遥控器、含有开机、关机、下一频道、上一频道、调高音量、调低音量、这几个功能
* */
public
class
TvController {
//开机状态
private
final
static
int
POWER_ON=1;
//关机状态
private
final
static
int
POWER_OFF=2;
private
int
mState
=POWER_OFF;
public
void
powerOn(){
mState=POWER_ON
;
if(mState
==POWER_OFF){
System.
out.println("开机了!"
);
}
}
public
void
PowerOff(){
mState=POWER_OFF
;
if(mState
==POWER_ON){
System.
out.println("关机了
!" );
}
}
public
void
nextChannel(){
if(mState
==POWER_ON){
System.
out.println("已经切换下一频道"
);
}
else{
System.
out.println("未开机"
);
}
}
public
void
prevChannel(){
if(mState
==POWER_ON){
System.
out.println("已经切换上一频道"
);
}
else{
System.
out.println("未开机"
);
}
}
public
void
turnUp(){
if(mState
==POWER_ON){
System.
out.println("已经调高音量"
);
}
else{
System.
out.println("未开机"
);
}
}
public
void
turnDowm(){
if(mState
==POWER_ON){
System.
out.println("已经调低音量"
);
}
else{
System.
out.println("未开机"
);
}
}
}
这样写的话可以看到有太多的if else来进行判断,而且修改的时候比较麻烦,利用状态模式的话是下面这样的
首先定义一个电视的状态接口,定义电视的操作函数
package
State;
/**
* 电视状态接口,定义了电视操作的函数
* */
public
interface
TvSAtate {
public
void
nextChannel();
public
void
prevChannel();
public
void
turnUp();
public
void
turnDown();
}
然后实现两个状态的操作,开机状态的操作和关机状态的操作:
package
State;
/**
* 关机状态,此时只有开机功能是有效的
* **/
public
class
PowerOffState
implements
TvSAtate{
@Override
public
void
nextChannel() {
//
TODO
Auto-generated method stub
}
@Override
public
void
prevChannel() {
//
TODO
Auto-generated method stub
}
@Override
public
void
turnUp() {
//
TODO
Auto-generated method stub
}
@Override
public
void
turnDown() {
//
TODO
Auto-generated method stub
}
}
开机状态
package
State;
/**
* 开机状态
* */
public
class
PowerOnState
implements
TvSAtate{
@Override
public
void
nextChannel() {
//
TODO
Auto-generated method stub
System.
out.println("下一频道"
);
}
@Override
public
void
prevChannel() {
//
TODO
Auto-generated method stub
System.
out.println("上一频道"
);
}
@Override
public
void
turnUp() {
//
TODO
Auto-generated method stub
System.
out.println("调高音量"
);
}
@Override
public
void
turnDown() {
//
TODO
Auto-generated method stub
System.
out.println("调低音量"
);
}
}
定义一个电源操作接口
package
Controller;
/**
* 电源操作接口
* */
public
interface
PowerController {
public
void
powerOn();
public
void
powerOff();
}
然后是他的实现
/**
* 状态模式下的遥控器
* **/
public
class
TvControllerToStae
implements
PowerController{
TvSAtate
mState;
public
void
setTvState(TvSAtate
sAtate){
this.mState
=sAtate
;
}
@Override
public
void
powerOn() {
//
TODO
Auto-generated method stub
setTvState(
new
PowerOnState());
System.
out.println("已经开机"
);
}
@Override
public
void
powerOff() {
//
TODO
Auto-generated method stub
setTvState(
new
PowerOffState());
System.
out.println("已经关机"
);
}
public
void
nextChannel(){
mState.nextChannel();
}
public
void
prevChannel(){
mState.prevChannel();
}
public
void
turnUp(){
mState.turnUp();
}
public
void
turnDowm(){
mState.turnDown();
}
}
然后是运行
package
Client;
public
class
Clien {
public
static
void
main(String[]
args) {
TvControllerToStae
tvControllerToStae=new
TvControllerToStae();
//开机之后的操作
tvControllerToStae.powerOn();
tvControllerToStae.prevChannel();
tvControllerToStae.turnUp();
tvControllerToStae.turnDowm();
tvControllerToStae.nextChannel();
System.
out.println("------我是一个漂亮的分割线------"
);
//关机之后的操作
tvControllerToStae.powerOff();
tvControllerToStae.prevChannel();
tvControllerToStae.turnUp();
tvControllerToStae.turnDowm();
tvControllerToStae.nextChannel();
}
}
在安卓中,状态模式比较典型的就是WIFI的管理