Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ТиМП Лабораторная работа 2

.pdf
Скачиваний:
0
Добавлен:
08.08.2026
Размер:
475 Кб
Скачать

Министерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования

«ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ» (ТУСУР)

Кафедра комплексной информационной безопасности электронно-

вычислительных систем (КИБЭВС)

ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ Отчет по лабораторной работе №2

по дисциплине «Технологии и методы программирования» Вариант №6

Студент гр. 7x3-x

___________ xxxxxxxxxx

___________ yyyyyyyyyy

___________

Принял Преподаватель кафедры БИС

______ ___________ К. В. Меденцев

___________

Томск 2025

 

Оглавление

Введение...................................................................................................................

3

1 ХОД РАБОТЫ .......................................................................................................

4

Заключение ..............................................................................................................

7

2

Введение

Целью работы является изучение основных паттернов проектирования и реализация их на практике согласно варианту.

Вариант №6: Телефон. Атрибуты: номер, баланс. Операции: позвонить, ответить на звонок, завершить разговор, пополнить баланс. Состояния: ожидание, звонок, разговор.

3

1 ХОД РАБОТЫ

Для выполнения лабораторной работы было необходимо выбрать паттерн проектирования, который далее должен быть реализован в программе.

Был выбран поведенческий паттерн State (состояние).

Телефон может находится в четырёх состояниях: ожидание звонка

(WaitingState), входящий вызов (IncomingCallState), разговор (InCallState).

Класс для каждого состояния наследуется от интерфейса PhoneState с

методами Call, RecieveCall, Answer, EndCall.

WaitingState:

Call: создает вызов и переходит в InCallState;

RecieveCall: телефон переходит в состояние IncomingCallState;

Answer: нет входящих вызовов, появляется об этом сообщение,

перехода в новое состояние нет;

– EndCall: нет активного звонка, появляется об этом сообщение,

перехода в новое состояние нет.

IncomingCallState:

Call: нельзя совершить вызов, появляется об этом сообщение, перехода

вновое состояние нет;

RecieveCall: телефон уже находится в состоянии, когда есть входящий вызов, появляется об этом сообщение, перехода в новое состояние нет;

Answer: принимается входящий вызов, переход в InCallState;

EndCall: входящий вызов отклонен, переход в WaitingState.

InCallState:

– Call: нельзя позвонить во время звонка, появляется об этом сообщение,

перехода в новое состояние нет;

– RecieveCall: нельзя принять еще один звонок во время разговора,

появляется об этом сообщение, перехода в новое состояние нет;

– Answer: телефон уже в состоянии звонка, появляется об этом сообщение, перехода в новое состояние нет;

4

– EndCall: завершается звонок, переход в WaitingState.

Класс Phone. Поля: Number (номер телефона), Balance (баланс номера телефона), State (состояние, в котором находится телефон). Методы:

SetPhoneNumber: изменяет номер телефон;

SetBalance: изменяет баланс на телефоне;

GetNumber: возвращает номер телефон;

GetBalance: возвращает баланс на телефоне;

Call, RecieveCall, Answer, EndCall: для каждого состояния выполняет свои процедуры, описанные выше;

TopUpBalance: пополняет баланс на определенную сумму.

На рисунке 1.1 представлена диаграмма классов, на которой отображены все описанные выше классы.

Далее на языке программирования C# была написана программа согласно диаграмме классов, реализующую паттерн по варианту.

5

Рисунок 1.1 – Диаграмма классов

6

Заключение

В ходе выполнения лабораторной работы была достигнута поставленная

цель.

7

Приложение А

(обязательное)

Программа реализации паттерна

using System.Text.RegularExpressions;

class Phone

{

public string Number { get; set; } public decimal Balance { get; set; } public PhoneState State { get; set; }

public Phone(string number, string balance)

{

this.SetPhoneNumber(number);

this.SetBalance(balance); this.State = new WaitingState();

}

public void SetPhoneNumber(string number)

{

string pattern = @"^(\+7 |8 )?\d{3} \d{3} \d{2} \d{2}$"; try

{

if (number == null)

{

throw new ArgumentNullException();

}

else if (!Regex.IsMatch(number, pattern))

{

throw new FormatException();

}

}

catch (ArgumentNullException)

{

Console.WriteLine($"Введите номер телефона"); return;

}

catch (FormatException)

{

Console.WriteLine("Неверный формат номера телефона.\n" + "Пример: +7 000 000 00 00 или 8 000 000 00 00");

return;

}

8

catch

{

Console.WriteLine("Неизвестная ошибка"); return;

}

this.Number = number;

}

public void SetBalance(string balance)

{

string pattern = @"^\d+\,\d{2}$"; try

{

if (Regex.IsMatch(balance, pattern))

{

decimal sum = decimal.Parse(balance); if (sum <= 0)

{

throw new ArgumentOutOfRangeException();

}

}

else

{

throw new FormatException();

}

}

catch (OverflowException)

{

Console.WriteLine("Слишком большое число.\n" + "Пример: 100,99");

return;

}

catch (ArgumentNullException)

{

Console.WriteLine("Сумма баланса должна быть не пустым значением.\n" + "Пример: 100,99");

return;

}

catch (FormatException)

{

Console.WriteLine("Неверный формат баланса. После точки только 2

цифры\n" +

"Пример: 100,99");

return;

9

}

catch (ArgumentOutOfRangeException)

{

Console.WriteLine("Баланс пополняется только на неотрицательную сумму"); return;

}

catch

{

Console.WriteLine("Неизвестная ошибка"); return;

}

this.Balance = decimal.Parse(balance);

}

public string GetBalance()

{

return $"Ваш баланс: {this.Balance}";

}

public string GetNumber()

{

return $"Ваш номер телефона: {this.Number}";

}

public void Call()

{

this.State.Call(this);

}

public void ReceiveCall()

{

this.State.ReceiveCall(this);

}

public void Answer()

{

this.State.Answer(this);

}

public void EndCall()

{

this.State.EndCall(this);

}

public void TopUpBalance(string deposit)

{

string pattern = @"^\d+\,\d{2}$"; try

{

if (!Regex.IsMatch(deposit, pattern))

10