• 状态模式


    参考文章:

    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());
        }

    输出

  • 相关阅读:
    结对-结对编项目贪吃蛇-最终程序
    团队-团队编程项目中国象棋-模块测试过程
    团队-团队编程项目中国象棋-模块开发过程
    团队-团队编程项目中国象棋-项目进度
    结对-结对编项目贪吃蛇-测试过程
    结对-贪吃蛇-开发过程
    课后作业-阅读任务-阅读提问-2
    20171005-构建之法:现代软件工程-阅读笔记
    结队-结队编程项目贪吃蛇-项目进度
    课后作业-阅读任务-任务阅读-2
  • 原文地址:https://www.cnblogs.com/amei0/p/8000896.html
Copyright © 2020-2023  润新知