Java设计模式——行为模式——状态模式(STATE)

状态模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类

uml

        

  • Context上下文环境,定义客户感兴趣的接口,维护一个State子类的实例,该实例定义了对象的当前状态
  • State抽象状态,定义一个接口以封装与 Context 的一个特定状态相关的行为。
  • ConcreteState具体状态,实现抽象状态中定义的接口,从而达到不同状态下的不同行为。
/*
* 抽象文件状态类
* */
public interface State {
    void fileState();
}
public class NotDealState implements State {
    @Override
    public void fileState() {
        System.out.println("文件状态未处理状态");
    }
}
public class DealingState implements State {
    @Override
    public void fileState() {
        System.out.println("文件正在处理状态");
    }
}
public class HasDealState implements State {
    @Override
    public void fileState() {
        System.out.println("文件已经处理状态");
    }
}
public class FileContext {
    //默认情况下文件是未处理状态
    private State fileState = new NotDealState();

    /*
     * 文件状态切换为未处理状态
     * */
    public void notDeal(){
        this.fileState = new NotDealState();
    }

    /*
    * 文件状态切换为正在处理状态
    * */
    public void Dealing(){
        this.fileState = new DealingState();
    }

    /*
    * 文件状态切换为已经处理状态
    * */
    public void HasDeal(){
        this.fileState = new HasDealState();
    }
    /*
    * 获取当前文件的状态
    * */
    public void getFileState(){
        fileState.fileState();
    }
}
public class Client {
    public static void main(String[] args) {
        FileContext fileContext = new FileContext();
        fileContext.getFileState();
        //切换为正在处理状态
        fileContext.Dealing();
        fileContext.getFileState();
        //切换为已经处理状态
        fileContext.HasDeal();
        fileContext.getFileState();
    }
}

文件状态未处理状态
文件正在处理状态
文件已经处理状态

使用场景

  • 1.对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为;
  • 2.代码中包含大量与对象状态有关的条件语句

优缺点

优点

  • 1.简化应用逻辑控制,减少依赖于状态的if-else
  • 2.更好的分离状态和行为
  • 3.更好的扩展性,扩展新的状态只需增加实现类,在需要维护的地方设置新状态即可
  • 4.显式化进行状态转换

缺点

  • 1.类文件增加
  • 2.逻辑分散,无法再一个地方就看出整个状态机的逻辑

猜你喜欢

转载自blog.csdn.net/qq_32465815/article/details/80098873