Java - 状态模式

-- 状态(State)模式,允许通过改变对象的内部状态而改变对象的行为。

一、模式结构

引用官方结构图:

组成(角色) 作用
Context (用户对象) 有State状态的引用。
State (状态抽象类) 提供状态行为的抽象
ConcreteState (具体状态) 实现具体行为

这里有多种实现方法,我们可以实现成对OCP(开闭原则)比较友好的,也可以实现成可读性友好的……

二、栗子 《用户在线与离线》

- 这里实现第二种(可读性较高,但不适用OCP)

1、状态抽象类

package com.behavior.state;

/**
 * @description: 状态
 * @author: ziHeng
 * @create: 2018-08-15 14:58
 **/
public interface State {

    void handle(Man man);

}

2、具体状态行为

(1)、在线行为 - (用户上线次数加一)

package com.behavior.state;

/**
 * @description: 状态:在线
 * @author: ziHeng
 * @create: 2018-08-15 15:00
 **/
public class OnlineState implements State{

    @Override
    public void handle(Man man) {
        //上线次数加一
        int onlineNum = man.getOnlineNum();
        man.setOnlineNum(++onlineNum);
        System.out.println(man.getName()+" - 在线中");
    }

}

(2)、离线行为

package com.behavior.state;

/**
 * @description: 状态:离线
 * @author: ziHeng
 * @create: 2018-08-15 15:00
 **/
public class OffLineState implements State{

    @Override
    public void handle(Man man) {
        System.out.println(man.getName()+" - 离线中");
    }

}

3、用户

package com.behavior.state;


import lombok.Data;

/**
 * @description: 人
 * @author: ziHeng
 * @create: 2018-08-15 15:07
 **/
@Data
public class Man {

    private String name;

    //上线次数
    private int onlineNum;

    private String status;

    //状态抽象类,具体行为
    private State state;


    public Man(String name) {
        this.onlineNum = 0;
        this.name = name;
        //初始状态为离线
        this.state = new OffLineState();
    }

    //改变状态 - 每次增加新的状态行为的都要重新修改此处代码
    public void setStatus(String status) {
        if("on".equals(status)){
            state = new OnlineState();
        }else if("off".equals(status)){
            state = new OffLineState();
        }else {
            System.out.println("没有该变化的状态处理类:"+status+" 默认为离线");
            state = new OffLineState();
        }
        state.handle(this);
    }
}

调用Test:

package com.behavior.state;

/**
 * @description: 状态模式
 * @author: ziHeng
 * @create: 2018-08-15 14:33
 **/
public class StateTest {

    public static void main(String[] args) {
        Man man = new Man("张三");
        //第一次上线
        man.setStatus("on");
        //下线
        man.setStatus("off");
        //又上线
        man.setStatus("on");

        //查看上线次数
        System.out.println("用户:"+man.getName()+" 共上线"+man.getOnlineNum()+"次");



    }

}

猜你喜欢

转载自blog.csdn.net/weixin_39569611/article/details/81707448