Java与模式笔记(25)

状态(State)模式是对象的行为模式,又称状态对象模式(Pattern of Object for States)。状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

状态模式结构与角色

 

抽象状态(State)角色:定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。

具体状态(ConcreteState)角色:每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

环境(Context)角色:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个具体状态类的实例给出此环境对象的现有环境。

在以下各种情况下可以使用状态模式

1、  一个对象的行为依赖于它所处的状态,对象的行为必须随着其状态的改变而改变。

2、  对象在某个方法里依赖于一重或多重的条件转移语句,其中有大量的代码。状态模式把条件转移语句的每一个分支都包装到一个单独的类里。这使得这些条件转移分支能够以类的方式独立存在和演化。维护这些独立的类也就不再影响到系统的其他部分。

状态模式的优点是使程序免于大量的条件转移语句,使程序实际上更易于维护。

状态模式的缺点是会造成大量的小的状态类。

状态模式的实现

1、  谁来定义状态的变化。状态模式并没有规定哪一个角色决定状态发生转移的条件。如果转移条件是固定的,那么决定就应当由Context角色来做。然而,如果让State子类自行决定它的下一个继任者是谁,以及在什么时候进行转换,就更有灵活性。

2、  状态对象的创立和湮灭。其中值得权衡的做法有两种:

A) 动态地创立所需要的状态对象,不要创立不需要的状态对象。当不再需要某一状态对象时,便马上把此状态对象的实例湮灭掉。这种情况适合于实现不知道要使用哪一个状态对象,而一旦开始使用便不再频繁变更的情况。

B) 事先创立所有的对象,然后不再湮灭它们。适用于状态变化比较快和频繁、加载这些状态对象的成本较高的情况。

环境类可以把它自己作为参量传递给状态对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值