LABA4
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное бюджетное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР) Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
Паттерны проектирования
Отчет по лабораторной работе №4 по дисциплине «Технологии и методы программирования»
Вариант №1
Выполнил Студент гр. 730-2
Подойницын К.В.
____Фатеев А.В.
____Астра Г.А.
23.01.2023
Принял Преподаватель каф. КИБЭВС
Давыдова Е.М.
23.01.2023
Томск 2023
Введение
В данной лабораторной работе необходимо изучить основные паттерны
проектирования и реализовать их на практике согласно варианту 1, это хранитель и
прототип.
2
Ход работы
Паттерн Хранитель используется для сохранения внутреннего состояния. В классе
«Originator» происходят все действия создания объекта и изменение его атрибутов.
Также обязательно имеются методы сохранения и возврата состояния. С помощью метода, в котором сохраняется состояние, происходит создания «воспоминания» с
состоянием «Originator». А все хранящиеся воспоминания находятся в классе
«Caretaker». В итоге можно с помощью метода возврата состояния к можно вернуть сохраненный воспоминания. Ниже представлен код примера. На рисунке 1.1 вывод работы программы.
//MEMENTO
class Memento
{
public string Color { get; private set; } public string Figure { get; private set; }
public string Transparency { get; private set; }
public Memento(string color, string figure, string transparency)
{
Color = color; Figure = figure;
Transparency = transparency;
}
}
//CARETAKER class SaveHistory
{
public Stack<Memento> History { get; private set; } public SaveHistory()
{
History = new Stack<Memento>();
}
}
//ORIGINATOR class Editor
{
private string Color; private string Figure; private string Transparency;
public Editor(string figure, string color, string transparency)
{
Color = color; Figure = figure;
Transparency = transparency;
Console.WriteLine($"Фигура создана. Характеристики: " +
$"Фигура = {Figure}, Цвет = {Color}, Прозрачность = {Transparency}\n");
}
public void SetColor(string color)
{
Color = color;
Console.WriteLine($"Установлен цвет -- {color}");
}
public void SetFigure(string figure)
{
Figure = figure;
3
Console.WriteLine($"Установленая фигура -- {figure}");
}
public void SetTransparency(string transparency)
{
Transparency = transparency;
Console.WriteLine($"Установленая прозрачность -- {transparency}");
}
public Memento Save()
{
Console.WriteLine($"Сохранение. Характеристики: " +
$"Фигура = {Figure}, Цвет = {Color}, Прозрачность = {Transparency}\n"); return new Memento(Color, Figure, Transparency);
}
public void ReturnSave(Memento memento)
{
Color = memento.Color; Figure = memento.Figure;
Transparency = memento.Transparency; Console.WriteLine($"Сохранение отменено. Характеристики: " +
$"Фигура = {Figure}, Цвет = {Color}, Прозрачность = {Transparency}\n");
}
public void GetFeature()
{
Console.WriteLine($"Характеристики: " +
$"Фигура = {Figure}, Цвет = {Color}, Прозрачность = {Transparency}\n");
}
}
static void Main(string[] args)
{
Editor editor = new Editor("Квадрат", "Желтый", "98%"); editor.SetFigure("Ромб");
SaveHistory history = new SaveHistory(); history.History.Push(editor.Save()); editor.SetColor("Зеленый"); editor.SetTransparency("43%"); editor.GetFeature(); editor.ReturnSave(history.History.Pop());
}
}
4
Рисунок 1.1 – Вывод работы программы
Паттерн прототип производит создание объекта на основе клонирования существующего объекта.
Далее приведен код, где есть родительский класс Interface Character, от которого идут потомки с теми же методами, но с другими типами данных.
class Program
{
static void Main(string[] args)
{
Character gamer = new Human(1500, 40); Character clonedgamer = gamer.Clone(); gamer.GetInfo(); clonedgamer.GetInfo();
gamer = new Human(100, 40); gamer.GetInfo(); clonedgamer.GetInfo();
gamer = new Knight("Тяжелый"); clonedgamer = gamer.Clone(); gamer.GetInfo(); clonedgamer.GetInfo(); Console.Read();
}
}
interface Character
{
Character Clone(); void GetInfo();
}
class Human : Character
{
int HP;
5
int damage;
public Human(int hp, int dmg)
{
HP = hp; damage = dmg;
}
public Character Clone()
{
return new Human(this.HP, this.damage);
}
public void GetInfo()
{
Console.WriteLine("Человек, твоё здоровье {0} и урон {1}", HP, damage);
}
}
class Knight : Character
{
string knight_class;
public Knight(string kn_cl)
{
knight_class = kn_cl;
}
public Character Clone()
{
return new Knight(this.knight_class);
}
public void GetInfo()
{
Console.WriteLine("Рыцарь, твой класс {0}", knight_class);
}
}
}
Рисунок 1.2 – Вывод работы программы
6
Заключение
В ходе выполнения лабораторной работы были созданы примеры паттернов
Хранитель и Прототип, и протестированы.
7