Java设计模式-22、状态模式-处理对象的多种状态及其相互转换

第22章:状态模式-处理对象的多种状态及其相互转换

定义:

状态模式(State Pattern):允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

Java设计模式-22、状态模式-处理对象的多种状态及其相互转换_第1张图片

结构:

Java设计模式-22、状态模式-处理对象的多种状态及其相互转换_第2张图片

代码实现:

//抽象状态类
abstract class State {
   
    //声明抽象业务方法,不同的具体状态类可以不同的实现
    public abstract void handle();
}
//具体状态类
class ConcreteState extends State {
   
    public void handle() {
   
        //方法具体实现代码
    }
}
//环境类:拥有多种状态的对象
class Context {
   
    private State state; //维持一个对抽象状态对象的引用
    private int value; //其他属性值,该属性值的变化可能会导致对象状态发生变化

    //设置状态对象
    public void setState(State state) {
   
        this.state = state;
    }

    public void request() {
   
        //其他代码
        state.handle(); //调用状态对象的业务方法
        //其他代码
    }
    
}
  1. 可以在环境类中提供专门方法进行状态转换
    public void changeState() {
   
        //判断属性值,根据属性值进行状态转换
        if (value == 0) {
   
            this.setState(new ConcreteStateA());
        } else if (value == 1) {
   
            this.setState(new javaConcreteStateB());
        }
        //......
    }
  1. 也可以在具体状态类中提供专门方法进行状态转换
public void changeState(Context ctx) {
   
    //根据环境对象中的属性值进行状态转换
    if (ctx.getValue() == 1) {
   
        ctx.setState(new ConcreteStateB());
    } else if (ctx.getValue() == 2) {
   
        ctx.setState(new ConcreteStateC());
    }
    //......
}

应用实例:

银行信用卡系统

账户三种状态:

  1. 账户余额>=0,正常状态,可存可取
  2. -2000<账户余额<0,透支状态,可存可取,计算利息
  3. 账户余额=-2000,受限状态,只能存,计算利息

Java设计模式-22、状态模式-处理对象的多种状态及其相互转换_第3张图片

package wgg;

//账户类
class Account {
   
    private String state; //状态
    private int balance; //余额
    //......

    //存款操作
    public void deposit() {
   
        //存款
        stateCheck();
    }

    //取款操作
    public void withdraw() {
   
        //账户为正常或透支状态时可取
        if (state.equalsIgnoreCase("NormalState") || state.equalsIgnoreCase("OverdraftState")) {
   
            //取款
            stateCheck();
        } else {
   
            //取款受限
        }
    }

    //计算利息操作
    public void computeInterest() {
   
        if (state.equalsIgnoreCase("OverdraftState") || state.equalsIgnoreCase("RestrictedState")) {
   
            //计算利息
        }
    }

    //状态检查和转换操作
    public void stateCheck() {
   
        if (balance >= 0) {
   
            state = "NormalState";
        } else if (balance > -2000 && balance < 0) {
   
            state = "OverdraftState";
        } else if (balance == -2000) {
   
            state = "RestrictedState";
        } else if (balance < -2000) {
   
            //操作受限
        }
    }
    //......

你可能感兴趣的:(Java设计模式,java,设计模式)