GOF之状态模式

                状态模式(State pattern)

  什么是状态模式呢?所谓的状态模式,指的是对于同一个对象而言,不同的状态对应着

不同的行为,同时,这些状态和行为之间是可以转化的,由一个状态转向另外的一个状态。其实这样的例子生活中是很多的。


  

 最常见的应该是红绿灯了。一共有三个状态。其中,红灯表示的是不可以通过,黄灯表示的是警告,绿灯表示的是可以通行。这是是同一个对象对应着不同的状态,不同的状态又表示的是不同的行为。

  再比如我们的房间的预订。房间的状态也有三个。空闲,预订,已入住三个状态。这几个状态之间是可以相互转化的。就比如下面的图所示:


  

   

 

 

当然我们首先想到的应该是使用if ,else if ,else.但是这种办法明显是不够好的。


 

 

所以当我们遇到这种需要频繁修改对象的状态的时候,那么我们就可以考虑使用状态模式了。

那么什么是状态模式呢?


 

首先,我们需要定义的是一个抽象的状态类State.State又有几个实现了它的接口的抽象类。并且特别需要注意的是,Context类中拥有State类的一个引用。所以说,这个Context类的作用是定义了当前的状态。这是要注意的。

  那么具体来说,我们如何来实现呢?

  package com.bjsxt.state;

 

public interface State {

void handle();

}

 

package com.bjsxt.state;

 

/**

 * 空闲状态

 * @author Administrator

 *

 */

public class FreeState implements State {

 

@Override

public void handle() {

System.out.println("房间空闲!!!没人住!");

}

 

}

 

 

package com.bjsxt.state;

 

/**

 * 已预订状态

 * @author Administrator

 *

 */

public class BookedState implements State {

 

@Override

public void handle() {

System.out.println("房间已预订!别人不能定!");

}

 

}

 

package com.bjsxt.state;

 

/**

 * 已入住状态

 * @author Administrator

 *

 */

public class CheckedInState implements State {

 

@Override

public void handle() {

System.out.println("房间已入住!请勿打扰!");

}

 

}

 

package com.bjsxt.state;

 

 

/**

 * 房间对象

 * @author Administrator

 *

 */

//其实这个类表示的应该是一个房间类。

public class HomeContext {

//如果是银行系统,这个Context类就是账号。根据金额不同,切换不同的状态!

//比如说是什么白金状态,VIP状态等。

private State state;

public void setState(State s){

System.out.println("修改状态!");

state = s;

state.handle();

}

}

 

 

package com.bjsxt.state;

 

 

public class Client {

public static void main(String[] args) {

HomeContext ctx = new HomeContext();

ctx.setState(new FreeState());

ctx.setState(new BookedState());

}

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱coding的同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值