Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЗФ-307_ПеровВН_Наблюдатель.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
452.36 Кб
Скачать
  1. Заключение

В ходе данной работы был рассмотрен, изучен и реализован аспект объектно-ориентированного программирования паттерн – наблюдатель. А также ознакомились с основами объектно-ориентированного проектирования, расмотрели историю ООП и также тип паттернов. Поскольку заданием был именно паттерн «Наблюдатель», в качестве примера этого шаблона была выбрана реализация космического корабля и управляющего монитора, который отражает нам статус корабля: текущую скорость полета, координаты передвижения, активирован щит или нет. Язык реализации был С#, среда разработки Visual Studio. Графический интерфейс программы создавался с помощью windows forms. Были созданы елементы управления атрибуттам корабля, а также информативное окно (монитор), который отображает статус корабля. Этот пример хорошо отображает и раскрывает главные аспекты шаблона наблюдатель, который применяется постоянно в более высоком уровне программирования, для создания систем.

  1. Список использованных источников

1 Гамма Э, Р. Хелм, Р. Джонсон, Д. Влиссидес. Приемы объектно-ориентированного проектирования. Паттерны проектирования. Design Patterns: Elements of Reusable Object-Oriented Software. Количество страницу 366, год издания 2016.

2 Майкл Томас, Пратик Пател, Алан Хадсон, Доналд Болл(мл.) Секреты программирования для Internet на Java.- Ventana Press, Ventana Communications Group, U.S.A.,1996, Издательство "Питер Пресс", 1997

3 Крис Джамса Библиотека программиста Java .- Jamsa Press, 1996, ООО "Попурри", 1996

4 Стив Макконнелл. Совершенный код = Code complete. — СПб.: Питер, 2005. — С. 896. — (Мастер-класс). — ISBN 5-7502-0064-7, 5-469-00822-3.

  1. Приложение а

Интерфейс Subject

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace WindowsFormsApplication1.pattern

{

interface Subject

{

//Добавление

void Attach(Observer o);

//Удаление

void Detach(Observer o);

//Синхронизация с наблюдателем

void Notify();

}

}

Класс SpaceShip

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace WindowsFormsApplication1.pattern

{

class SpaceShip : Subject

{

//Список мониторов

List<Observer> monitors = new List<Observer>();

//Переменные активации щита

public static int SHIELD_ON = 1;

public static int SHIELD_OFF = 0;

private int currentVelocity; //текущая скорость

private int shieldStatus = SHIELD_OFF; // по умолчанию защитный щит корабля, отключен

int[] coordinates = new int[3]; //x,y,z

//Установка скорости корабля

public void Speed(int velocity)

{

this.currentVelocity = velocity;

Notify();

}

//Перемещение корабля в космосе

public void Move(int[] coord)

{

this.coordinates = coord;

Notify();

}

//Активировать щит

public void Shield(int cmd)

{

this.shieldStatus = cmd;

Notify();

}

//Добавить наблюдателя (монитор)

public void Attach(Observer o)

{

monitors.Add(o);

}

//Удалить наблюдателя (монитор)

public void Detach(Observer o)

{

monitors.Remove(o);

}

//Вызвать обновление для каждого монитора

public void Notify()

{

foreach (var m in monitors)

{

m.Update(this);

}

}

//Доступ считывания значений переменных

public int CurrentVelocity => currentVelocity;

public int ShieldStatus => shieldStatus;

public int[] Coordinates => coordinates;

}

}

Интерфейс Observer

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace WindowsFormsApplication1.pattern

{

interface Observer

{

//Обновление

void Update(object o);

}

}

Класс SpaceShipMonitor

namespace WindowsFormsApplication1.pattern

{

class SpaceShipMonitor : Observer

{

private Subject subject;

private string status;

//Обновленние статуса

public void Update(object o)

{

if (!(o is SpaceShip)) return;

var ship = (SpaceShip) o;

status = "Current velocity: " + ship.CurrentVelocity + "\nCoordinates X: " + ship.Coordinates[0]

+ ", Y: " + ship.Coordinates[1] + ", Z: " + ship.Coordinates[2] + "\nShield " + ship.ShieldStatus;

}

//Доступ считывания статуса

public string Status => status;

//При инициализации добавить монитор статуса на корабль

public SpaceShipMonitor(Subject s)

{

subject = s;

subject.Attach(this);

}

//Удалить этот монитор

public void MonitorOff()

{

subject.Detach(this);

subject = null;

}

}

}

Класс форма Main

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

using WindowsFormsApplication1.pattern;

namespace WindowsFormsApplication1

{

public partial class Form1 : Form

{

private SpaceShip ship;

private SpaceShipMonitor monitor;

public Form1()

{

InitializeComponent();

ship = new SpaceShip();

monitor = new SpaceShipMonitor(ship);

ship.Move(new [] {0,0,0});

ship.Speed(0);

ship.Shield(0);

showStatus();

}

private void button1_Click(object sender, EventArgs e)

{

if (textBox1.Text != null)

{

int speed = Convert.ToInt32(textBox1.Text);

ship.Speed(speed);

showStatus();

}

}

private void button2_Click(object sender, EventArgs e)

{

if (textBox2.Text != null && textBox4.Text != null && textBox5.Text != null)

{

int x = Convert.ToInt32(textBox2.Text);

int y = Convert.ToInt32(textBox4.Text);

int z = Convert.ToInt32(textBox5.Text);

ship.Move(new[] {x,y,z});

showStatus();

}

}

private void checkBox1_CheckedChanged(object sender, EventArgs e)

{

if (checkBox1.Checked)

{

ship.Shield(SpaceShip.SHIELD_ON);

}

else

{

ship.Shield(SpaceShip.SHIELD_OFF);

}

showStatus();

}

private void showStatus()

{

label5.Text = monitor.Status;

}

}

}