设计模式——状态模式

来源:互联网 发布:什么是淘宝客单价 编辑:程序博客网 时间:2024/06/05 05:09

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。

角色:

环境类(Context):  定义客户感兴趣的接口。维护一个ConcreteState子类的实例,这个实例定义当前状态。
抽象状态类(State):  定义一个接口以封装与Context的一个特定状态相关的行为。
具体状态类(ConcreteState):  每一子类实现一个与Context的一个状态相关的行为。

场景:

1.一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为。
2.一个操作中含有庞大的多分支机构,并且这些分支决定于对象的状态。
优点
 1、封装了转换规则。 
       2、枚举可能的状态,在枚举状态之前需要确定状态种类。 
       3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。 
       4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。 
       5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。
 缺点
       1、状态模式的使用必然会增加系统类和对象的个数。 
       2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。 
       3、状态模式对“开闭原则”的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态;而且修改某个状态类的行为也需修改对应类的源代码。
类图:

   代码:
package com.sun.state;/** * 状态抽象类 * @author work * */abstract class State {public abstract void handle(Seat context);}<strong></strong>

package com.sun.state;/** * 具体状态空闲 * @author work * */public class Free  extends State{@Overridepublic void handle(Seat context) {// TODO Auto-generated method stubcontext.setState(new Occupy());}public Free() {// TODO Auto-generated constructor stubSystem.out.println("空闲");}}

package com.sun.state;/** * 具体状态已占 * @author work * */public class Occupy extends State{@Overridepublic void handle(Seat context) {// TODO Auto-generated method stubcontext.setState(new Free());}public Occupy() {// TODO Auto-generated constructor stubSystem.out.println("已占");}}
package com.sun.state;/** * 环境座位 * @author work * */public class Seat {private State state;private Seat(State state) {super();this.state = state;}public State getState() {return state;}public void setState(State state) {this.state = state;}public void sitDown() {System.out.println("此座位已坐人。。。。。");state.handle(this);}public void leave() {System.out.println("此座位已空闲人离开了。。。。。");state.handle(this);}public static void main(String[] args) {Seat seat = new Seat(new Free());seat.sitDown();seat.leave();}}
座位在空闲和已占两个状态间切换。
打印结果:
空闲
此座位已坐人。。。。。
已占
此座位已空闲人离开了。。。。。
空闲

0 0
原创粉丝点击