状态模式
定义:对有状态的对象,把复杂的“判断逻辑”提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为。
核心:用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题
角色:
1) Context环境类:环境类中维护一个State对象,它定义了当前的状态
2) State抽象状态类
3) ConcreteState具体状态类:每一个类封装了一个状态对应的行为
图示:
package com.offcn.designpattern.statepattern; public class StatepatternDemo { public static void main(String[] args) { Context c = new Context(); c.setState(new BookState()); c.setState(new FreeState()); c.setState(new InState()); } } //1) Context环境类 class Context{ private State state; public void setState(State s){ System.out.println("修改状态中。。"); this.state = s; state.handle(); } } //2) State抽象状态类 interface State{ void handle(); } //3) ConcreteState具体状态类 class FreeState implements State{ @Override public void handle() { System.out.println("房间空闲状态"); } } //3) ConcreteState具体状态类 class BookState implements State{ @Override public void handle() { System.out.println("房间已预定状态"); } } //3) ConcreteState具体状态类 class InState implements State{ @Override public void handle() { System.out.println("房间已入住状态"); } }
输出:
优点:
1)状态模式将与特定状态相关的行为局部化到一个状态中,并且将不同状态的行为分割开来,满足“单一职责原则”。
2)减少对象间的相互依赖。将不同的状态引入独立的对象中会使得状态转换变得更加明确,且减少对象间的相互依赖。
3)有利于程序的扩展。通过定义新的子类很容易地增加新的状态和转换。
缺点:
1)状态模式的使用必然会增加系统的类与对象的个数。
2)状态模式的结构与实现都较为复杂,如果使用不当会导致程序结构和代码的混乱。
使用场景:
1) 银行系统中账户状态的管理
2) OA系统中公文状态的管理
3) 酒店系统中,房间状态的管理
4) 线程对象各状态之间的切换
原文:https://www.cnblogs.com/bai3535/p/12333002.html