【学习小记】UML——状态机图

什么是状态机图?

UML状态机图同活动图一样,是动态视图的一种。

UML状态机图描述的是某个对象的状态和感兴趣的事件,以及对象响应该事件的行为。它描述的是“某个对象”,因此,一个状态机图中只能表示一个对象,而不是多个对象。状态图显示了该对象的生命周期,也即,对象经历的事件,对象的转换和对象在这些事件之间的状态。


几个概念的理解

状态:状态是指在对象生命周期中,满足某些条件、执行某些活动或者等待某些事件的一个条件和状况。换句话说就是,对象在事件发生之间某时刻所处的情形。

 比如,人是一个类,而你,我,他则是一个对象。坐着,躺着,饱的,饿的则是“你”的一种状态。

状态无关:若一个对象对某个事件的响应总是相同的,则认为此对象对于该事件状态无关

举个不算很恰当的例子,“你”是一个对象,“饱的”,“饿的”则是“你”的一种状态。对于事件“给一个发霉的面包”,不管你处于“饱的”还是“饿的”,你的响应都是“把它扔掉“。所以,你对”给一个发霉的面包“是状态无关的。

状态无关对象:若对于所有事件,对象的响应总是相同的,则该对象是一个状态无光对象

状态依赖对象:对事件的响应根据对象的状态或模式的不同而不同。

事件(event):指一件值得注意的事情的发生。

转换(transition):转换是两个状态之间的关系,表明当某事件发生时,对象从先前的状态转换到后来的状态。


状态图的表示

1、状态

      UML状态机图中的状态,以圆角方框表示,通常有状态名称,进入/退出活动,内部转换,子状态,延迟事件组成(后面介绍)。

      状态还包括初始状态(由实心黑圆点表示)和终止状态(由实心黑圆点外包一个圆圈表示)。



2、事件

      事件包含在转换中,见3、转换


3、转换

      转换涉及的内容包括:源状态、目标状态、触发事件(事件)、监护条件、动作,具体可以参看下图的例子。

1)源状态:受转换影响的状态。


2)目标状态:当转换完成之后对象所处的状态。

 *(在转换激活前,对象处于源状态,在转换激活之后,进入目标状态。)


3)触发事件

用来为转换定义一个事件,当源状态中的对象接收到这个事件时,会使转换被激活。当定义了监护条件时,还需要满足监护条件。

事件通常有以下几种类型:

a、调用事件表示语法:方法名(参数)

调用事件接收一个对象显示的同步调用请求。

b、改变事件表示语法:when(表达式)

改变事件是指依赖于指定属性值的布尔表达式得到满足,是一种一直等待直到特定条件被满足的声明方式。(留意:改变事件中的条件是一直计算直到布尔表达式为真为止)

c、信号事件:表达语法:信号名(参数)

信号是两个对象之间通信的媒介。信号事件接收对象间显示的、命名的异步通信。

d、时间事件:表示语法:after(时间)

 时间可以指定为绝对形式,如:after(11:00),也可以指定为相对形式,如:after(3 seconds)


4)监护条件

当对象接收到触发事件时,对监护条件(通常是一个布尔表达式)求值,值为真时,激活转换,否则转换不激活。注意,监护条件与之前提到的改变事件不一样,监护条件只在触发事件时才会计算一次,而改变事件是一直计算。


5)动作

当转换被激活后,若定了相应的动作,那么将执行这个动作。它可以是一个赋值语句,简单的算术运算,发送信号,调用操作,创建和销毁对象,读取和设置属性的指, 甚至是包含多个动作的活动。


转换的种类

1、外部转换

表示语法:事件(参数)[监护条件]/动作

对事件做出响应,引起状态变化或自身转换,同时引发一个特定动作,如果离开或进入状态,将引发进入转换和离开转换。

             

2、内部转换

表示语法:event 事件(参数)[监护条件]/动作

对事件做出响应,并执行一个特定的活动,但并不引起状态变换或进入转换,离开转换。(用来处理一些不离开该状态的事件。注意与自身转换的区别。自身转换是先离开,再进入。)


3、进入转换

表示语法:entry/活动

当进入某一个状态时,执行相应的动作。


4、退出转换

表示语法: exit/活动

当离开某一个状态时,执行响应的动作。


活动和延迟事件

活动:

表示语法:do/动作名

当对象处于一个状态的同时,对象做着某些工作,并一直继续到被某个事件中端。

例如,你在用QQ登录的时候,你点一下登录按钮之后,头像移动到了对话框中间,后面有动画,这个动画就是一种活动。当对话框处于验证用户的状态时,就一直执行显示动画的动作,知道用户验证结束。


延迟事件:

表示语法:事件/defer

指该事件不会触发状态的转换,当对象处于该状态时,事件不会丢失,但会被延迟执行。

例如,当email程序正在发送第一封邮件时,用户下达发送第二封邮件的指令会被延迟,直到第一封邮件发送完成后,才发送第二封邮件。

转换的几个例子:

                                   

如何绘制状态机图

      绘制状态机图的基本步骤为:

      1、寻找主要状态

      2、确定状态间的转换,可借助状态转换分析表

      3、细化状态内部的活动和转换

            根据需要添加内部转换、进入转换、退出转换以及相关的活动等。

      4、用复合状态来展开细节

      下面用一个例子来进行绘制过程的演示。


描述文档:

simple digital watch

   A simple digital watch has a display and two buttons to set it, the A buttonand the B button. The watch has two modes of operation, display time and set time. In the displaytime mode, hours and minutes are displayed, separated by a flashingcolon. 
    The set time mode has two sub-modes, set hours and set minutes. The A button isused to select modes. Each timeA is pressed, the mode advances in sequence: display, set hours,set minutes, display etc. Within the sub-modes, theB button is used to advance the hours or minutesonce each time it is pressed. Buttons must be released before they cangenerate another event.

要绘制这个watch的状态机图,按照以上的四个步骤:

1、寻找主要状态

      从文本描述中,可以发现以下状态:display_time,      set_time,      set_hour,      set_minute

      其中,set_time是一个复合状态,包含set_hour和set_minute两个子状态


2、确定状态间的转换

      由于状态数目少,可以利用转换分析表来确定状态间的转换。

      

      根据这些转换,便可以绘制出如下的状态机图

      

3、细化状态内部的活动与转换

      此步根据需要,对每个主要状态添加内部转换、进入转换、退出转换以及相 关的活动。

      1)display状态:

            该状态实现的是每次进入display状态后,就要显示当前的时间,因此需要添加一个进入转换,实现一进入该状态就显示时间。

      2)sethour状态和set minute状态:

            这两个状态要完成的动作类似,都是针对时间的某个单位进行设置。设置完成后,离开本状态需要对修改进行保存,否则对时间的设置都不能完成了。

            因此对这两个状态都要添加退出转换save_hour()和save_minute()。


4、使用复合状态来展开细节

       在步骤1分析中,set_hour和set_minute都是set_time的子状态,因此使用一个复合状态set_time来表示set_hour和set_minute两个子状态。


综合以上四个步骤,可绘制出如下状态机图:



到此,watch的状态机图就完成了。



说明:

1、若有错误或不合理的地方,欢迎评论指出,共同进步。

2、原创文章,转载请注明出处,谢谢。

3、参考书籍:《UML和模式应用》(第三版),《UML面向对象建模基础》


接入第三方登录是让用户方便快捷地使用已有账号登录你的网站或应用程序,提高用户体验的一种方式。本文将介绍如何使用 PHP 实现微信公众号第三方登录。 1. 获取微信授权 首先,需要获取微信用户的授权。具体步骤如下: 1)引导用户打开微信授权页面: ```php $appid = 'your_appid'; $redirect_uri = urlencode('http://yourdomain.com/callback.php'); $scope = 'snsapi_userinfo'; $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=$appid&redirect_uri=$redirect_uri&response_type=code&scope=$scope&state=STATE#wechat_redirect"; header("Location: $url"); ``` 其中,`$appid` 是你的微信公众号的 AppID,`$redirect_uri` 是授权后回调的 URL,`$scope` 是授权作用域,可以是 `snsapi_base` 或 `snsapi_userinfo`,`$state` 是自定义参数,用于防止 CSRF 攻击。 2)获取授权码: 用户同意授权后,会重定向到 `$redirect_uri` 指定的 URL,带上授权码 `code` 和 `state` 参数。 ```php $code = $_GET['code']; $state = $_GET['state']; ``` 3)获取 access_token 和 openid: 使用授权码 `code` 获取 `access_token` 和 `openid`。 ```php $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appid&secret=$secret&code=$code&grant_type=authorization_code"; $response = file_get_contents($access_token_url); $result = json_decode($response, true); $access_token = $result['access_token']; $openid = $result['openid']; ``` 其中,`$secret` 是你的微信公众号的 AppSecret。 2. 获取用户信息 获取到 `access_token` 和 `openid` 后,可以使用以下代码获取用户信息: ```php $userinfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN"; $response = file_get_contents($userinfo_url); $userinfo = json_decode($response, true); ``` 其中,`$userinfo` 包含用户的昵称、头像等信息。 3. 将用户信息保存到数据库 最后,将获取到的用户信息保存到数据库中,以便下次使用时快速登录。 ```php // 连接数据库 $con = mysqli_connect('localhost', 'username', 'password', 'database'); mysqli_set_charset($con, "utf8"); // 查询用户是否已存在 $sql = "SELECT * FROM users WHERE openid='$openid'"; $result = mysqli_query($con, $sql); if (mysqli_num_rows($result) == 0) { // 用户不存在,插入新用户信息 $nickname = mysqli_real_escape_string($con, $userinfo['nickname']); $headimgurl = mysqli_real_escape_string($con, $userinfo['headimgurl']); $sql = "INSERT INTO users (openid, nickname, headimgurl) VALUES ('$openid', '$nickname', '$headimgurl')"; mysqli_query($con, $sql); } // 保存用户登录状态 $_SESSION['openid'] = $openid; ``` 以上就是使用 PHP 实现微信公众号第三方登录的步骤。需要注意的是,为了确保安全性,应该对用户输入的数据进行过滤和验证,防止 SQL 注入和 XSS 攻击等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值