文档章节

Java设计模式----状态模式

o
 osc_n6euf5h6
发布于 2019/03/19 20:00
字数 803
阅读 5
收藏 0

精选30+云产品,助力企业轻松上云!>>>

电灯开关一般有两个状态:开和关,通过按下开关可以关闭或者打开电灯。那么,“开”和“关”实际上应该是开关的两种内部状态,当开关的状态发生变化时,其行为也会发生变化,比如,开关状态变为了“关”,那么就应该熄灯

并且使能“开”。


 1.状态模式

状态模式的定义如下:

状态模式(State Pattern), 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类。

当你遇到如下问题时,可以考虑状态模式:

  • 根据很多条件分支判断执行什么方法时;
  • 当某一对象的内部状态改变,其某个方法的实现应该相应改变;
  • 未来可能会扩展新的状态,为了遵循开闭原则时。

你有以上问题,那么不妨考虑状态模式是否适合你当前的业务。状态模式的UML类图如下:

State: 抽象状态类或者接口,定义了handle()方法,表示每个状态的行为;

ConcreteStataA: 具体状态;

StateContext: 上下文环境,保存一个或者多个状态的引用,对客户端暴露一个简单的接口request()来统一处理请求。

 


2.代码实现

使用开篇提到的通过开关控制电灯的例子,开关Button有两种状态:开OnState, 关OffState.   Button中保存有状态的引用,可以通过setState方法来设置。Button对客户端提供了一个统一简洁的接口: press(),即按下按钮,按第一次开灯,再按一次关灯,再按一次再开灯。。。

/**
 * 开关状态接口
 */
interface State {
    /** 控制电灯方法 */
    void control(Button button);
}

/** 开关状态: 开*/
class OnState implements State {

    private static final State INSTANCE = new OnState();

    private OnState() { }

    public static State instance() {
        return INSTANCE;
    }

    @Override
    public void control(Button button) {
        //更新Button中开关的状态
        button.setState(OffState.instance());
        //开灯
        System.out.println("开灯...");

    }
}

/** 开关状态:关*/
class OffState implements State {

    private static final State INSTANCE = new OffState();

    private OffState() { }

    public static State instance() {
        return INSTANCE;
    }

    @Override
    public void control(Button button) {
        //更新Button中开关的状态
        button.setState(OnState.instance());
        //开灯
        System.out.println("关灯...");

    }
}

/**
 * 开关,相当于状态的上下文环境
 */
class Button {
    private State state;
    public Button() {
        state = OnState.instance();
    }

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

    public void press() {
        state.control(this);
    }
}


/** 客户端点用 */
public class StateDemo {
    public static void main(String[] args) {
        Button button = new Button();
        //第一次按开关
        button.press();
        //第二次按开关
        button.press();
    }
}

输出结果:

开灯...
关灯...

 


 

3.总结

某些场合,面向对象的程序设计当中将事物的状态视作对象,不同状态为不同对象,而不同对象有不同的行为,状态模式将不同的行为相互分离,当更改或者扩展行为时就不会影响到现有行为,且可以在运行时动态地改变状态从而选择不同的行为,从这个角度来看,状态模式的结构与策略模式非常相似,只不过策略模式通常是由客户端来选择使用哪一种策略,而状态模式封装了条件语句,因而就是由程序动态地选择相应的行为。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
【java设计模式】-00目录

开篇 【java设计模式】-01设计模式简介 创建型模式: 【java设计模式】-02工厂模式(Factory Pattern) 结构型模式: 【java设计模式】-07适配器模式(Adapter Pattern) 行为型模式: 【jav...

osc_3www0d3o
2018/06/18
35
0
Java开发中的23种设计模式详解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接...

osc_ld3u7lka
2018/07/27
8
0
常用的设计模式有哪些?

创建型 工厂模式与抽象工厂模式 (Factory Pattern)(Abstract Factory Pattern) 单例模式 (Singleton Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 结构型...

osc_vyztkm1b
2019/12/27
4
0
深入探索Java设计模式(二)之策略模式

抽丝剥茧 细说架构那些事——【优锐课】 策略设计模式是Java API库中常见的模式之一。这与另一个设计模式(称为状态设计模式)非常相似。本文是在学习完优锐课JAVA架构VIP课程—【框架源码专...

osc_1njk964l
04/16
19
0
设计模式-小村长的学习笔记

作者:小村长 疫情期间重新温习了一遍设计模式,期间查阅了很多博客学习了其他老师对于设计模式的见解。然后整理成笔记分享给大家,同时也非常欢迎大家指出笔记中有所欠缺的地方,希望本系列...

01/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

深入浅出Zabbix 3.0 -- 第二章 Zabbix Web操作与定义

第二章 Zabbix Web操作与定义 本章介绍Zabbix 中一些基本概念的定义和web前端页面的操作,包括Zabbix中使用的一些术语的定义,Web页面中用户管理、主机和主机组的管理,以及监控项、模板、触...

osc_5zaxkz1e
23分钟前
14
0
深入浅出Zabbix 3.0 -- 第一章 Zabbix 安装与配置

第一章 Zabbix 安装与配置 1.1 Zabbix 介绍 Zabbix是一个企业级的开源监控软件,可以监控IT基础架构的可用性和应用的性能,为用户提供集中管理、分布式监控的一站式(all in one)监控解决方...

osc_nvkeo9cj
24分钟前
10
0
PHP 实现抽奖逻辑

public static function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr); //概率数组循环 forea......

chenhongjiang
24分钟前
18
0
struts2 上传 下载

东方部落: http://11144439.blog.51cto.com struts中上传文件功能小测试。这里jar是 2.5 版本。 项目结构图 废话不多说,直接代码。 2. web.xml配置 <?xml version="1.0" encoding="UTF-8......

osc_1qix3fyb
25分钟前
31
0
SVN管理系统安装及其操作

SVN管理系统安装及操作 防伪码:学习永远不晚! 前言: SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上...

osc_afifi2qt
27分钟前
24
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部