java设置按钮状态_Java设计模式----状态模式

电灯开关一般有两个状态:开和关,通过按下开关可以关闭或者打开电灯。那么,“开”和“关”实际上应该是开关的两种内部状态,当开关的状态发生变化时,其行为也会发生变化,比如,开关状态变为了“关”,那么就应该熄灯

并且使能“开”。

1.状态模式

状态模式的定义如下:

状态模式(State Pattern), 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

当你遇到如下问题时,可以考虑状态模式:

根据很多条件分支判断执行什么方法时;

当某一对象的内部状态改变,其某个方法的实现应该相应改变;

未来可能会扩展新的状态,为了遵循开闭原则时。

你有以上问题,那么不妨考虑状态模式是否适合你当前的业务。状态模式的UML类图如下:

ac2e885f741f39e578134fac5a73c3a4.png

State: 抽象状态类或者接口或者使用枚举,定义了handle()方法,表示每个状态的行为;

ConcreteStataA: 具体状态;

StateContext: 上下文环境,保存一个或者多个状态的引用,对客户端暴露一个简单的接口request()来统一处理请求。

2.代码实现

使用开篇提到的通过开关控制电灯的例子,开关Button有两种状态:开OnState, 关OffState.   Button中保存有状态的引用,可以通过setState方法来设置。Button对客户端提供了一个统一简洁的接口: press(),即按下按钮,按第一次开灯,再按一次关灯,再按一次再开灯。。。

/*** 开关状态接口*/

interfaceState {/**控制电灯方法*/

voidcontrol(Button button);

}/**开关状态: 开*/

class OnState implementsState {private static final State INSTANCE = newOnState();privateOnState() { }public staticState instance() {returnINSTANCE;

}

@Overridepublic voidcontrol(Button button) {//更新Button中开关的状态

button.setState(OffState.instance());//开灯

System.out.println("开灯...");

}

}/**开关状态:关*/

class OffState implementsState {private static final State INSTANCE = newOffState();privateOffState() { }public staticState instance() {returnINSTANCE;

}

@Overridepublic voidcontrol(Button button) {//更新Button中开关的状态

button.setState(OnState.instance());//开灯

System.out.println("关灯...");

}

}/*** 开关,相当于状态的上下文环境*/

classButton {privateState state;publicButton() {

state=OnState.instance();

}public voidsetState(State state) {this.state =state;

}public voidpress() {

state.control(this);

}

}/**客户端点用*/

public classStateDemo {public static voidmain(String[] args) {

Button button= newButton();//第一次按开关

button.press();//第二次按开关

button.press();

}

}

输出结果:

开灯...

关灯...

3.总结

某些场合,面向对象的程序设计当中将事物的状态视作对象,不同状态为不同对象,而不同对象有不同的行为,状态模式将不同的行为相互分离,当更改或者扩展行为时就不会影响到现有行为,且可以在运行时动态地改变状态从而选择不同的行为,从这个角度来看,状态模式的结构与策略模式非常相似,只不过策略模式通常是由客户端来选择使用哪一种策略,而状态模式封装了条件语句,因而就是由程序动态地选择相应的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值