
Описание модели взаимодействия
(Sequence diagram, Collaboration diagram)
Диаграммакоопераций
Этот тип диаграмм позволяет описать взаимодействия объектов, абстрагируясь от последовательности передачи сообщений. На этом типе диаграмм в компактном виде отражаются все принимаемые и передаваемые сообщения конкретного объекта, и типы этих сообщений. По причине того, что диаграммы Sequence и Collaboration являются разными взглядами на одни и те же процессы, RationalSoftwareArchitect позволяет создавать из Sequence диаграммы диаграмму Collaboration и наоборот, а также производит автоматическую синхронизацию этих диаграмм.
Временной аспект поведения может иметь существенное значение при моделировании синхронных процессов, описывающих взаимодействия объектов.
Диаграмма последовательности
С помощью диаграммы последовательности можно описать полный контекст взаимодействия как своеобразный временной график “жизни” всей совокупности объектов, взаимодействующих между собой для реализации варианта использования программной системы.
Описание диаграмм последовательности: описание диаграмм последовательности идентичны описанию диаграмм коопераций, только на диаграммах последовательности существуют еще понятие линия жизни объекта и фокус управления. В момент перехода из состояния в состояние предыдущий объект теряет фокус управления.
выставление времени
выставление времени часов:
Нажать и не отпускать на кнопку «уст. время»
Установить кнопками «Час» и «Мин» нужное время
Отпустить кнопку «уст. время»
выставление времени срабатывания будильника:
Нажать и не отпускать на кнопку «уст. будильник»
Установить кнопками «Час» и «Мин» нужное время срабатывания будильника
Отпустить кнопку «уст. будильник»
Переключение режимов работы
Режим работы «Вкл»
Отсчёт времени часов
Сравнение времени часов и времени срабатывания будильника
Режим работы «Выкл»
Отсчёт времени часов
Режим работы «Радио»
Отсчёт времени часов
Воспроизведение звука с модуля «Радио»
Режим работы «Таймер»
Отсчёт времени часов
Воспроизведение звука с модуля «Радио»в течение 30 минут
Предусловие
Закончено воспроизведение звука с модуля «радио»
Основной поток
Включение режима «вкл» без смены положения перключателя
Срабатывание будильника
Отсчёт времени часов
Предусловие
Режим «вкл» или режим «таймер»(после 30 минут)
Время часов == время срабатывания будильника
Основной поток
Воспроизведение звукового сигнала будильника
«Сброс» - Нажатие на кнопку «сброс» при срабатывании будильника
Предусловие
Воспроизведение сигнала будильника
Основной поток
Остановка сигнала будильника
Воспроизведение сигнала будильника через 5 минут
Приложение
UML Диаграмма
Диаграмма Use case
Activity diagram
Выставление времени
Сброс сигнала будильника
Выставление будильника
Переключение режимов работы
Диаграммы последовательностей:
Выставление времени на часах
Сброс будильника
Выставление времени срабатывания будильника
Переключение режимов работы
Листинг файлов
Time.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Media;
namespace timer
{
public class time
{
int hour;
int min;
int sec;
int m_sec;
public bool flag_show = true;
public time()
{
this.hour = DateTime.Now.Hour;
this.min = DateTime.Now.Minute;
this.sec = DateTime.Now.Second;
this.m_sec = DateTime.Now.Millisecond;
}
public time(int h, int m)
{
this.hour = h;
this.min = m;
this.sec = 0;
this.m_sec = 0;
}
public time(time a)
{
this.hour = a.hour;
this.min = a.min;
this.sec = a.sec;
this.m_sec = a.m_sec;
}
public void add_hour()
{
this.hour = (this.hour + 1) % 24;
}
public void add_min(int i = 1)
{
if (((this.min + i) / 60) > 0)
this.add_hour();
this.min = (this.min + i) % 60;
}
public void add_sec()
{
if (((this.sec + 1) / 60) > 0)
this.add_min();
this.sec = (this.sec + 1) % 60;
}
public string get_time(string str_flag = " ")
{
string str = this.hour.ToString("00");
str += str_flag + this.min.ToString("00");
str += str_flag + this.sec.ToString("00");
return str;
}
public string show_time()
{
if (DateTime.Now.Millisecond < 500)
return this.get_time(" : ");
return this.get_time();
}
public override bool Equals(object obj)
{
if (((time)obj).hour == this.hour && ((time)obj).min == this.min)
return true;
else
return false;
}
public static bool operator ==(time m1, time m2)
{
return m1.Equals(m2);
}
public static bool operator !=(time m1, time m2)
{
return !m1.Equals(m2);
}
public time ravno()
{
int a = this.hour;
int b = this.min;
time temp = new time (a, b);
return temp;
}
}
}
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Media;
namespace timer
{
public partial class Form1 : Form
{
// делегат для манипулирования лейбом
public delegate void DelegateForTime(Label label);
// поле типа делегата
DelegateForTime DelTime;
time a = new time();
time b = new time();
time c = new time();
time d = new time();
time f = new time();
bool alarm_flag = false;
bool flag_alarm_time = false;
bool flag_timer = false;
bool flag_radio = false;
bool flag_reset = false;
SoundPlayer WMP = new SoundPlayer();
// поток
Thread t;
public Form1()
{
InitializeComponent();
DelTime = new DelegateForTime(StartTime);// указываем метод делегату
WMP.SoundLocation = "sound.wav";
}
private void Form1_Load(object sender, EventArgs e)
{
b.add_min();
t = new Thread(lbl_time_show);// создаем поток
t.IsBackground = true;
t.Start();
}
void StartTime(Label l)
{
l.Text = a.show_time();
}
void lbl_time_show()
{
while (true)
{
Invoke(DelTime, lbl_time);// запускаем метод с главного потока
}
}
public void alarm()
{
if (a == b)
{
if (alarm_flag)
{
c = a.ravno();
c.add_min(2);
WMP.Play();
alarm_flag = false;
flag_alarm_time = true;
lbl_flag.Text = "ALARM!!!!";
}
}
if (flag_alarm_time && c == a)
{
WMP.Stop();
flag_alarm_time = false;
rbtn_off.Checked = true;
}
if (flag_reset)
{
if (a == f)
{
c = a.ravno();
c.add_min(2);
WMP.Play();
flag_reset = false;
lbl_flag.Text = "ALARM!!!!";
}
}
}
void radio()
{
if (flag_radio)
{
WMP.Stop();
lbl_flag.Text = "Play Radio";
}
}
void timer_time()
{
if (flag_timer)
{
d = a.ravno();
d.add_min(1);
radio();
flag_timer = false;
}
if (a == d)
{
flag_radio = false;
this.timer2.Enabled = true;
alarm_flag = true;
}
}
private void button1_Click(object sender, EventArgs e)
{
Close();
}
private void checkBox_time_Click(object sender, EventArgs e)
{
checkBox2_alarm.Checked = false;
if (checkBox_time.Checked)
{
lbl_time.Visible = true;
lbl_alarm.Visible = false;
}
}
private void checkBox2_alarm_Click(object sender, EventArgs e)
{
checkBox_time.Checked = false;
if (checkBox2_alarm.Checked)
{
lbl_time.Visible = false;
lbl_alarm.Visible = true;
refresh_alarm();
}
else
{
lbl_time.Visible = true;
lbl_alarm.Visible = false;
}
}
void refresh_alarm(){
lbl_alarm.Text = b.get_time();
}
private void btn_reset_alarm_Click(object sender, EventArgs e)
{
if (flag_alarm_time)
{
f = a.ravno();
f.add_min(1);
WMP.Stop();
flag_reset = true;
lbl_flag.Text = "Сброс";
}
}
private void btn_set_min_Click(object sender, EventArgs e)
{
if (checkBox_time.Checked) a.add_min();
if (checkBox2_alarm.Checked)
{
b.add_min();
refresh_alarm();
}
}
private void btn_set_hour_Click(object sender, EventArgs e)
{
if (checkBox_time.Checked) a.add_hour();
if (checkBox2_alarm.Checked)
{
b.add_hour();
refresh_alarm();
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
this.t.Abort();
}
private void timer1_Tick(object sender, EventArgs e)
{
a.add_sec();
}
private void timer2_Tick(object sender, EventArgs e)
{
alarm();
if (rbtn_timer.Checked) timer_time();
}
private void rbtn_on_CheckedChanged(object sender, EventArgs e)
{
if (rbtn_on.Checked)
{
lbl_flag.Text = "on";
flag_radio = false;
this.timer2.Enabled = true;
alarm_flag = true;
}
}
private void rbtn_off_CheckedChanged(object sender, EventArgs e)
{
if (rbtn_off.Checked)
{
lbl_flag.Text = "off";
flag_radio = false;
alarm_flag = false;
WMP.Stop();
}
}
private void rbtn_radio_CheckedChanged(object sender, EventArgs e)
{
if (rbtn_radio.Checked)
{
lbl_flag.Text = "radio";
WMP.Stop();
flag_radio = true;
alarm_flag = false;
radio();
}
}
private void rbtn_timer_CheckedChanged(object sender, EventArgs e)
{
if (rbtn_timer.Checked)
{
lbl_flag.Text = "timer";
bool flag_radio = true;
flag_timer = true;
timer_time();
}
}
}
}
Screenshot