JAVA设计模式之状态模式

JAVA设计模式之状态模式

概念:

状态模式(status),用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。

角色

Context环境类:维护一个state对象,定义当前状态。

State抽象状态类

ConcretaState具体状态类:每个类封装了一个状态对应的行为。

类图

状态模式类图

应用

线程对象各状态之间的切换

酒店系统中的房间状态

OA系统中的公文状态

代码

 
public interface State {
    void handle();
}
 
public class FreeSate implements State {

    @Override
    public void handle() {
        System.out.println("room is free");
    }
}

public class BookSate implements State {
    @Override
    public void handle() {
        System.out.println("room is booked");
    }
}

public class CheckedInState implements State {
    @Override
    public void handle() {
        System.out.println("room is check in");
    }
}
 
// Context环境类
public class RoomContext {
    private State state;

    public State getState() {
        return state;
    }

    public void setState(State state) {
        System.out.println("modify state");
        this.state = state;
        state.handle();
    }
}
 
public class Main {
    public static void main(String[] args) {
        RoomContext ctx = new RoomContext();
        ctx.setState(new FreeSate());

        ctx.setState(new BookSate());
    }
}

总结

使用状态模式前,客户端外界需要介入改变状态,而状态改变的实现是琐碎或复杂的。

使用状态模式后,客户端外界可以直接使用事件Event实现,根本不必关心该事件导致如何状态变化,这些是由状态机等内部实现。

这是一种Event-condition-State,状态模式封装了condition-State部分。
每个状态形成一个子类,每个状态只关心它的下一个可能状态,从而无形中形成了状态转换的规则。如果新的状态加入,只涉及它的前一个状态修改和定义。

状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数;其缺点在于使用状态模式会增加系统类和对象的个数,且状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱,对于可以切换状态的状态模式不满足“开闭原则”的要求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值