状态模式

基本介绍

1.主要解决对象在多种状态转换时,需要对外输出不同的行为的问题

2.状态之间可以相互转换,当一个对象的内在状态改变时,允许改变其行为,行为可能引起状态的改变

3.状态和行为是一一对应的,同一个行为,在不同状态下,有不同的实现

 

角色

1.Context:环境角色,维护一个 ConcreteState 对象,该对象定义了当前状态

2.State:抽象状态角色,接口 / 抽象类,封装不同状态下 Context 的相关行为

3.ConcreteState:具体状态角色,实现 State,每个子类实现在该状态下,与 Context 的相关行为

 

事项

1.优点

(1)强可读性,每个状态的行为封装到对应的一个类中,把转换规则封装在状态类

(2)耦合降低,每个状态只需要关心自己内部的实现,而不会影响到其他的状态,

(3)方便维护,容易增删状态,将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为

(4)可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数

2.缺点

(1)类膨胀:每个状态都要一个对应的类,当状态过多时会产生很多类,加大维护难度

(2)增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码

3.应用场景

(1)当一个事件或者对象有很多种状态,状态之间会相互转换,对不同的状态要求有不同的行为时

(2)条件、分支语句(if else)的代替者。

 

策略模式、状态模式

1.策略模式:控制对象使用什么策略,策略是手动转换的

2.状态模式:状态模式会自动改变状态,在相关的状态类方法里面封装转换的过程,状态的改变是在状态内部发生的,在执行动作时进行自动的转换

 

代码示例

public class Client {//客户端

    public static void main(String[] args) {
        Context context = new Context();
        ConcreteState1 concreteState1 = new ConcreteState1();
        ConcreteState2 concreteState2 = new ConcreteState2();
        concreteState1.action(context);
        concreteState2.action(context);
    }
}

class Context {//环境
    private State state;
    public ConcreteState1 concreteState1 = new ConcreteState1();
    public ConcreteState2 concreteState2 = new ConcreteState2();

    public Context() {
        this.state = concreteState1;
    }

    public void setState(State state) {
        this.state = state;
    }
}

interface State {//抽象状态

    void action(Context context);
}

class ConcreteState1 implements State {//具体状态1

    @Override
    public void action(Context context) {
        System.out.println("Context处于状态 1 执行行为");
        System.out.println("Context从状态 1 转换为状态 2");
        context.setState(context.concreteState2);
    }
}

class ConcreteState2 implements State {//具体状态2

    @Override
    public void action(Context context) {
        System.out.println("Context处于状态 2 执行行为");
        System.out.println("Context从状态 2 转换为状态 1");
        context.setState(context.concreteState1);
    }
}

 

posted @   半条咸鱼  阅读(48)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示