ТооП / Тооп(3)
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
НАБЕРЕЖНОЧЕЛНИНСКИЙ ИНСТИТУТ (ФИЛИАЛ)
КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ
ЛАБОРАТОРНАЯ РАБОТА №3
«Реализация паттернов. Наблюдатель»
По дисциплине
«Технологии объектно-ориентированного программирования»
Выполнил:
Студент группы 2161121
Золотых С.В.
Проверил:
Зубков Е.В.
Набережные Челны
2017
Цель работы:
Реализовать паттерн проектирования Наблюдатель.
Код программы:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Pattern_4_2_
{
class Program
{
static void Main(string[] args)
{
//создание объектов классов
var drink_machina = new Drink_machina();
var cofee_drink = new Cofee_drink();
var soda_drink = new Soda_drink();
var tea_drink = new Tea_drink();
Console.WriteLine(" Здесь будут отображаться изменения в акциях в заведении 'Кофе-брейк' ");
Console.WriteLine(" Сделайте выбор: \n 1 - Кофе \n 2 - Содовая \n 3 - Чай \n 4 - КОфе + чай + содовая \n 5 - Кофе + содовая \n 6 - Кофе + чай \n 7 - Чай + содовая ");
Console.WriteLine("--------------------------------");
int control = Convert.ToInt32(Console.ReadLine());
//создание наблюдателей, которые фиксируют изменения в акциях и выводят их по желанию пользователя
switch (control)
{
case 1:
drink_machina.Stock_show(cofee_drink);
drink_machina.Call();
break;
case 2:
drink_machina.Stock_show(soda_drink);
drink_machina.Call();
break;
case 3:
drink_machina.Stock_show(tea_drink);
drink_machina.Call();
break;
case 4:
drink_machina.Stock_show(cofee_drink);
drink_machina.Stock_show(soda_drink);
drink_machina.Stock_show(tea_drink);
drink_machina.Call();
break;
case 5:
drink_machina.Stock_show(cofee_drink);
drink_machina.Stock_show(soda_drink);
drink_machina.Call();
break;
case 6:
drink_machina.Stock_show(cofee_drink);
drink_machina.Stock_show(tea_drink);
drink_machina.Call();
break;
case 7:
drink_machina.Stock_show(soda_drink);
drink_machina.Stock_show(tea_drink);
drink_machina.Call();
break;
default:
break;
}
Console.ReadLine();
}
//интерфейс для наблюдателя
public interface IDrink
{
void Stock_show(Drink drink);
void Stock_announce();
}
//общий интерфейс объектов
public interface Drink
{
void Stock_sub(string cofee, string soda, string tea);
void withdraw();
}
//класс для кофе
class Cofee_drink : Drink
{
private string cofee;
public void Stock_sub(string cofee, string soda, string tea)
{
this.cofee = cofee;
withdraw();
}
public void withdraw()
{
Console.WriteLine(cofee);
}
}
//класс для содовой
class Soda_drink : Drink
{
private string soda;
public void Stock_sub(string cofee, string soda, string tea)
{
this.soda = soda;
withdraw();
}
public void withdraw()
{
Console.WriteLine(soda);
}
}
//класс для чая
class Tea_drink : Drink
{
private string tea;
public void Stock_sub(string cofee, string soda, string tea)
{
this.tea = tea;
withdraw();
}
public void withdraw()
{
Console.WriteLine(tea);
}
}
//класс получения информации об акциях
public class Drink_machina : IDrink
{
private static Random mass= new Random();
public List<Drink> stocks = new List<Drink>();
//случайная акция для кофе
public string Stock_cofee()
{
var news = new List<string>
{
"Эспрессо всего за 40 рублей!",
"Капучино сегодня будет вам стоить только 55 рублей!",
};
return news[mass.Next(2)];
}
//случайная акция для содовой
public string Stock_soda()
{
var news = new List<string>
{
"Fanta (2 литра) всего за 59 рублей!",
"Акции на Coca-Cola сегодня нет(",
"Стоимость Pepsi(1,5л) сегодня 45 рублей!"
};
return news[mass.Next(3)];
}
//случайная акция для чая
public string Stock_tea()
{
var news = new List<string>
{
"Стоимость зелёного чая: 30 рублей)",
"Стоимость чёрного чая: 20 рублей)"
};
return news[mass.Next(2)];
}
//метод для создания нужной акции и добавление её в коллекцию
public void Stock_show(Drink drink)
{
stocks.Add(drink);
}
//метод для показа акции
public void Stock_announce()
{
string cofee = Stock_cofee();
string soda = Stock_soda();
string tea = Stock_tea();
//по элементам коллекции
foreach (Drink drink in stocks)
{
drink.Stock_sub(cofee, soda, tea);
}
}
//метод для независимого вывода
public void Call()
{
Stock_announce();
}
}
}
}
Блок-схема:
Начало
var
drink_machina = new
Drink_machina(); var
cofee_drink = new
Cofee_drink(); var
soda_drink = new
Soda_drink(); var
tea_drink = new
Tea_drink();
control=Convert.ToInt32(Console.ReadLine())
drink_machina.Stock_show(cofee_drink);
drink_machina.Call();
Case
1
Case
2 drink_machina.Stock_show(soda_drink);
drink_machina.Call();
Case3
drink_machina.Stock_show(tea_drink);
drink_machina.Call();
Case
4 drink_machina.Stock_show(cofee_drink);
drink_machina.Stock_show(soda_drink);
drink_machina.Stock_show(tea_drink);
drink_machina.Call();
Case
5 drink_machina.Stock_show(cofee_drink);
drink_machina.Stock_show(soda_drink);
drink_machina.Call();
Case
6 drink_machina.Stock_show(cofee_drink); drink_machina.Stock_show(tea_drink);
drink_machina.Call();
Case
7 drink_machina.Stock_show(soda_drink); drink_machina.Stock_show(tea_drink); drink_machina.Call();
Конец
Начало
Начало
string
cofee; string
Stock_cofee()
Stock_sub(string
cofee, string
soda, string
tea) this.cofee
= cofee; withdraw();
public
string
Stock_soda()
withdraw() Console.WriteLine(cofee);
string
Stock_tea()
Stock_show(Drink
drink) stocks.Add(drink);
Конец
Stock_announce()
string
cofee = Stock_cofee(); string
soda = Stock_soda(); string
tea = Stock_tea(); drink.Stock_sub(cofee,
soda,tea);
Call() Stock_announce();
Конец
Классы Soda_drink и Tea_drink аналогичны классу Cofee_drink.
Результат выполнения:
Вывод:
Для решения задания была применена абстракция приложения, извещающего об акциях. Для этого были созданы три класса Cofee_drink, Soda_drink, Tea_drink, реализующие общий интерфейс Drink и в которых реализованы соответствующие методы вызова объекта. Класс Drink_machina реализует интерфейс IDrink с методами фиксирования изменения в объектах и перенаправлением информации об этих изменения в метод Call(). В основной программе были созданы 7 наблюдателей, которые извещают пользователя об акциях, то есть изменениях в объектах.