You are on page 1of 6

МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДI ТА СПОРТУ УКРАЇНИ

НАЦІОНАЛЬНИЙ ТЕХНІЧНИЙ УНІВЕРСИТЕТ


«ХАРКІВСЬКИЙ ПОЛІТЕХНІЧНИЙ ІНСТИТУТ»

ІНЖЕНЕРНО-ФІЗИЧНИЙ ФАКУЛЬТЕТ
КАФЕДРА ДИНАМІКИ І МІЦНОСТИ МАШИН

Стек-технології .NET
Індивідуальне домашнє завдання

Виконав: Мамедов Е.М.


студент групи І-16б
Перевірив: Потопальська К.Є.

Харків 2018
Задача: використовуючи шаблон проектування "Наблюдатель" необхідно
розробити додаток, в якому є дві кнопки, при натисканні на які генерується
два типа подій. Також є три панелі, які змінюють колір на випадковий при
настанні першої події, а при настанні другої події на панель виводиться
поточний час випадковим кольором. В додатку можна динамічно
додавати/видаляти підписантів на події. Додати кнопку, яка генерує третій
тип події, згідно варіанту:

Варіант 9: Білу кнопку, після натискання на яку виникає подія і в заголовку


передплатника виводиться "Привет".

Рис. 1 - Форма програми

Як видно на формі розміщено 5 кнопок, та 3 панелі. При натисканні на певну


кнопку виконується закладений в неї програмний код , як результат
виконується дія описана на кнопці. Перейдемо до створених класів, які й
реалізують паттерн "Наблюдатель". Їх всього чотири: перший
Subject(абстрактний клас, який представляє спостережуваний об'єкт), другий
ConcreteSubject(реалізація абстрактного класу Subject), третій
Observer(абстрактний клас, який представляє спостерігача) та четвертий
ConcreteObserve(реалізація абстрактного класу ConcreteSubject ).

Subject:

Створюємо абстрактний клас з абстрактними функціями, які в подальшому


будемо перевизначать. Пропишемо 3 функції : додати, видалити , повідомити
та одну змінну, для того щоб розуміти яку дію виконувати.
abstract class Subject

abstract public void Attach(Observer observer);

abstract public void Detach();

abstract public string State{get;set;}

abstract public void Notify();

ConcreteSubject:

Перейдемо до реалізації класу Subject, для цього створюємо клас


ConcreteSubject, який унаслідується від Subject. Реалізуємо його за
стандартом паттерну , але додаємо ще в нього список типу Observer, під який
в конструкторі буде виділено пам'ять. Та змінюємо функцію Detach() , якщо в
стандартному вигляді вона приймає один параметр, а саме глядача якого буде
видалено, то тут ми просто "говоримо" , що потрібно видалити останнього
спостерігача, при чому і з списку і з форми.
public override void Detach()

{if (observers.Count != 0)

{observers[observers.Count - 1].panel.Dispose();

observers.Remove(observers[observers.Count - 1]);

}else { MessageBox.Show("Закончились зрители!"); }

Observe:

Абстрактний клас в якому є функція Update(string state), яка сприймає


текстову змінну, за допомогою якої в подальшому будемо розуміти, яку дію
виконувати. Також є змінна Panel , яка й виступає нашим глядачем.

ConcreteObserve:

Конкретна реалізація класу Observe. Те на що треба звернути увагу, так це на


те як будуть змінюватися глядачі за допомогою функції Update(state).
{ switch(state)

{case "1":{

Random ran = new Random();

panel.BackColor = Color.FromArgb(ran.Next(255), ran.Next(255), ran.Next(255));

break; }
case "2":

{Random ran = new Random();

l.Text = DateTime.Now.ToLongTimeString();

l.ForeColor = Color.FromArgb(ran.Next(255), ran.Next(255), ran.Next(255));

panel.Controls.Add(l);

break; }

case "3":

l.Text = "Привет";

break;

Інший код описує взаємодію компонентів з програмою, тобто для кожної


кнопки визначена подія , яка характеризує дію при натисканні на кнопку,
також при самому створенні форми, відразу з нею створюються 3 панелі, які
також перші поміщаються до списку глядачів.

Висновок: під час лабораторної роботи №9 були отриманні знання про


паттерн "Наблюдатель" та за допомогою завдання на реалізацію даного
паттерна, вони ж були закріплені.

Код програми:
namespace WindowsFormsApplication6
using System;
using System.Collections;
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;

namespace WindowsFormsApplication6
{
public partial class Form1 : Form
{
internal ConcreteSubject subject = new ConcreteSubject();
public Form1()
{
InitializeComponent();
ConcreteObserver observer = new ConcreteObserver();
observer.panel = panel1;
subject.Attach(observer);
observer = new ConcreteObserver();
observer.panel = panel2;
subject.Attach(observer);
observer = new ConcreteObserver();
observer.panel = panel3;
subject.Attach(observer);
}

private void Form1_Load(object sender, EventArgs e

{
button3.BackColor = Color.White;

private void button4_Click(object sender, EventArgs e)


{
Random ran = new Random();
Panel panel = new Panel();
panel.Location = new Point(ran.Next(0,700),ran.Next(0,400));
panel.Size = new Size(70,60);
panel.BackColor = Color.FromArgb(ran.Next(255), ran.Next(255), ran.Next(255));
Controls.Add(panel);
ConcreteObserver observer = new ConcreteObserver();
observer.panel = panel;
subject.Attach(observer);

private void button5_Click(object sender, EventArgs e)


{
subject.Detach();

private void button1_Click(object sender, EventArgs e)


{
subject.State = "1";
subject.Notify();
}

private void button2_Click(object sender, EventArgs e)


{
subject.State = "2";
subject.Notify();
}

private void button3_Click(object sender, EventArgs e)


{
subject.State = "3";
subject.Notify();
}

abstract class Subject


{
abstract public void Attach(Observer observer);
abstract public void Detach();
abstract public string State{get;set;}
abstract public void Notify();
}

class ConcreteSubject:Subject
{
List<Observer> observers;
public ConcreteSubject()
{
observers = new List<Observer>();
}
public override void Attach(Observer observer)
{
observers.Add(observer);
}

public override void Detach()


{
if (observers.Count != 0)
{
observers[observers.Count - 1].panel.Dispose();
observers.Remove(observers[observers.Count - 1]);
}
else { MessageBox.Show("Закончились зрители!"); }
}

public override void Notify()


{
foreach (Observer observer in observers)
observer.Update(State);
}
public override string State{get;set;}
}

//----------//
abstract class Observer
{
public abstract void Update(string state);
abstract public Panel panel {get;set;}
}

class ConcreteObserver : Observer


{
Label l = new Label();
public override Panel panel { get; set; }
public override void Update(string state)
{
switch(state)
{
case "1":
{
Random ran = new Random();
panel.BackColor = Color.FromArgb(ran.Next(255), ran.Next(255), ran.Next(255));
break;
}
case "2":
{
Random ran = new Random();
l.Text = DateTime.Now.ToLongTimeString();
l.ForeColor = Color.FromArgb(ran.Next(255), ran.Next(255), ran.Next(255));
panel.Controls.Add(l);
break;
}
case "3":
{
l.Text = "Привет";
break;
}

}
}
}
}

You might also like