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