博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
状态模式
阅读量:5238 次
发布时间:2019-06-14

本文共 1531 字,大约阅读时间需要 5 分钟。

参考文章:

 

定义:

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

 

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

输出

转载于:https://www.cnblogs.com/amei0/p/8000896.html

你可能感兴趣的文章
Linux中Zabbix4.0的搭建
查看>>
《LoadRunner没有告诉你的》之六——获取有效的性能需求
查看>>
51nod1076 (边双连通)
查看>>
Item 9: Avoid Conversion Operators in Your APIs(Effective C#)
查看>>
js去除空格
查看>>
学习Spring Boot:(二十八)Spring Security 权限认证
查看>>
IT学习神器——慕课网App获App Store、Android应用市场重磅推荐
查看>>
Linux网络状态工具ss命令使用详解
查看>>
致妈妈
查看>>
面向对象封装与继承
查看>>
bzoj 1217: [HNOI2003]消防局的设立
查看>>
数据存储 mysql
查看>>
Django 表单
查看>>
配置phpmemcache扩展,Loaded Configuration File (none)
查看>>
阿里云服务器ubuntu64位配置java_web环境
查看>>
Android 自定义组合控件
查看>>
第二章 搭建Android开发环境--读书笔记
查看>>
代理的理解
查看>>
editPlus,3.7V 注册码
查看>>
【kindle】【转发】kindle链接WIFI自动断开问题
查看>>