zoukankan      html  css  js  c++  java
  • 状态模式

    参考文章:

    https://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html

    定义:

     当一个对象的内在状态改变时允许改变其行为

    uml类图:

    模式组成:

    • Contex(上下文):是一个类,它可以拥有一些内部状态
    • State(状态抽象):定义了一个所有具体状态的共同接口;任何状态都实现这个相同的接口,这样一来,状态之间可以互相替换
    • ConcreteState(具体状态): 处理来自Context的请求.每个ConcreteState都提供了它自己对于请求的实现.所以,当Context改变状态时行为也跟着改变

    优点:

    • 将与特定状态相关的行为局部化,并且将不同状态的行为分割开来
    • 所有状态相关的代码都存在于某个ConcereteState中,所以通过定义新的子类很容易地增加新的状态和转换
    • 状态模式通过把各种状态转移逻辑分不到State的子类之间,来减少相互间的依赖。

    应用:

    举个栗子:

    定义一个上下文 (灯,它的内部状态是 开或者关)

    class Light {
        State state=new OffState();
    
        public void press() {
            state.press(this);
        }
    
        public void turnOff() {
        }
    
        public void turnOn() {
        }
        public State getState() {
            return state;
        }
    }

    定义状态的抽象角色

    interface State {
    	public String getName();
    	public void press(Light light);
    }
    

     定义状态的具体实现 (开)

    class OnState implements State {
    
        @Override
        public void press(Light light) {
            light.turnOff();
            light.state = new OffState();
    
        }
    
        @Override
        public String getName() {
            return "on";
        }
    
    }

    定义状态的具体实现(关)

    class OffState implements State {
    
        @Override
        public void press(Light light) {
            light.turnOn();
            light.state = new OnState();
        }
    
        @Override
        public String getName() {
            return "off";
        }
    
    }

    上下文调用 (按两次按钮)

        public static void main(String[] args) {
            Light light=new Light();
            System.out.println("灯的状态是:"+light.getState().getName());
            light.press();
            System.out.println("灯的状态是:"+light.getState().getName());
            light.press();
            System.out.println("灯的状态是:"+light.getState().getName());
        }

    输出

  • 相关阅读:
    爬虫工程师分享:三步就搞定 Android 逆向
    爬虫工程师常用的 Chrome 插件
    Python 描述符(Descriptor) 附实例
    爬虫必备:Python 执行 JS 代码 —— PyExecJS、PyV8、Js2Py
    京东白条
    中国金融贷款整理
    接口文档管理工具YApi内网服务器搭建过程
    AWS申请图文及连接教程
    金融
    centos jdk 1.7升级到1.8后显示还是1.7
  • 原文地址:https://www.cnblogs.com/amei0/p/8000896.html
Copyright © 2011-2022 走看看