暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

设计模式【19】| 状态模式

数据与共享 2018-09-27
622

当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。


简而言之,直接更改某一个属性的行为不方便时,可以考虑状态模式,隐式的改变属性的某一状态,进而影响其行为。


1.问题假设

还是套用老问题,手机屏幕在不同的温度显示显示不同的亮度(A-贼亮,B-亮,C-暗),伴随着屏幕亮度的变化手机壳颜色完成了从红到黄再到绿的转换。

手机屏幕亮度:贼亮,亮,暗。

手机壳颜色:变红,变绿,变黄。


2.编码实现

手机壳的状态Model 

 Context  

private PhoneLightState state;

public PhoneLightState getState() {
    return state;
}

public void setState(PhoneLightState state) {
    this.state = state;
}

复制

 接口:PhoneLightState 

void action(Context context);
void showCurrentState();

复制

 贼亮: PhoneSuperLightState

implements PhoneLightState 

@Override
public void action(Context context) {
    context.setState(this);
}

@Override
public void showCurrentState() {
    System.out.println("贼亮"+"---变为红色");
}

复制

 亮: PhoneLittleLightState 

implements PhoneLightState 

@Override
public void action(Context context) {
    context.setState(this);
}

@Override
public void showCurrentState() {
    System.out.println("亮"+"---变为绿色");
}

复制

 暗:PhoneNotLightState

implements PhoneLightState

@Override
public void action(Context context) {
    context.setState(this);
}

@Override
public void showCurrentState() {
    System.out.println("暗"+"----变为黄色");
}

复制

 Test 

public static void main(String[] args{
    Context context = new Context();
    System.out.println("=========高温=======");
    PhoneSuperLightState superState = new PhoneSuperLightState();
    superState.action(context);
    context.getState().showCurrentState();
    System.out.println("=========中温=======");
    PhoneLittleLightState littleState = new PhoneLittleLightState();
    littleState.action(context);
    context.getState().showCurrentState();
    System.out.println("=========低温=======");
    PhoneLittleLightState notState = new PhoneLittleLightState();
    notState.action(context);
    context.getState().showCurrentState();
}

复制

 测试结果: 


说明:状态模式和观察者模式,有几分相似之处,观察者模式旨在订阅某一数据源,当订阅者发出通知时,观察者及时更新数据。而状态模式,旨在更改属性状态从而影响行为。



文章转载自数据与共享,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论