ТооП / Тооп(1)
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ
ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
«КАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
НАБЕРЕЖНОЧЕЛНИНСКИЙ ИНСТИТУТ (ФИЛИАЛ)
КАФЕДРА ИНФОРМАЦИОННЫХ СИСТЕМ
ЛАБОРАТОРНАЯ РАБОТА №1
«Реализация паттернов. Декоратор и Фасад»
По дисциплине
«Технологии объектно-ориентированного программирования»
Выполнил:
Студент группы 2161121
Золотых С.В.
Проверил:
Зубков Е.В.
Набережные Челны
2017
Цель работы:
Реализовать паттерны проектирования Фасад и Декоратор.
Код программы:
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;
namespace Pattern
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.BackColor = Color.FromArgb(255, 240, 178);
pictureBox1.Visible = false;
pictureBox2.Visible = false;
pictureBox4.Visible = false;
pictureBox5.Visible = false;
pictureBox6.Visible = false;
label1.Visible = false;
this.comboBox1.BackColor = Color.FromArgb(196, 155, 106);
this.comboBox1.ForeColor = Color.FromArgb(244, 221, 190);
this.comboBox1.FlatStyle = FlatStyle.Flat;
this.button1.BackColor = Color.FromArgb(196, 155, 106);
this.button1.ForeColor = Color.FromArgb(244, 221, 190);
this.button1.FlatAppearance.BorderSize = 0;
this.button1.FlatStyle = FlatStyle.Flat;
this.button1.Font = new Font("Monotype Corsiva", 18);
}
//базовый класс напитка
public abstract class Base
{
protected string Continue = " ";
public string Get_Start()
{
return Continue;
}
}
//один класс для создания других объектов
class Espresso : Base
{
public Espresso()
{
Continue = "Вы выбрали крепкий кофе ";
}
}
// абстрактные декоратор для проверки совместимости типов
abstract class Decorator_Base : Base { }
//Декоратор молоко
class Milk_Decorator : Decorator_Base
{
private Base base_1;
public Milk_Decorator(Base _base)
{
base_1 = _base;
Continue += base_1.Get_Start() + " с молоком";
}
}
//Декоратор сахар
class Sugar_Decorator : Decorator_Base
{
private Base base_1;
public Sugar_Decorator(Base _base)
{
base_1 = _base;
Continue = base_1.Get_Start() + " с сахаром";
}
}
//Декоратор шоколад
class Chocolate_Decorator : Decorator_Base
{
private Base base_1;
public Chocolate_Decorator(Base _base)
{
base_1 = _base;
Continue = base_1.Get_Start() + " с шоколадом";
}
}
// фасад собирает разрозненные классы в одну систему
class Cofee_Machina
{
//Эспрессо
public string Espresso_1()
{
Base espresso = new Espresso();
espresso.Get_Start();
return espresso.Get_Start();
}
//Капучино
public string Capuchino_1()
{
Base capuchino = new Milk_Decorator(new Espresso());
capuchino.Get_Start();
return capuchino.Get_Start();
}
//Капучино с сахаром
public string Capuchino_sugar()
{
Base capuchino_sugar = new Sugar_Decorator(new Milk_Decorator(new Espresso()));
capuchino_sugar.Get_Start();
return capuchino_sugar.Get_Start();
}
//Капучино с шоколадом
public string Capuchino_chocolate()
{
Base capuchino_chocolate = new Chocolate_Decorator(new Milk_Decorator(new Espresso()));
capuchino_chocolate.Get_Start();
return capuchino_chocolate.Get_Start();
}
//Капучино с сахаром и шоколадом
public string Capuchino_s_c()
{
Base capuchino_s_ch = new Chocolate_Decorator(new Sugar_Decorator(new Milk_Decorator(new Espresso())));
capuchino_s_ch.Get_Start();
return capuchino_s_ch.Get_Start();
}
}
private void button1_Click(object sender, EventArgs e)
{
Graphics g = CreateGraphics();
g.DrawString("Ваш кофе готов: ", new Font("Monotype Corsiva", 18), new SolidBrush(Color.FromArgb(155, 75, 16)), new PointF(150.0F, 190.0F));
// создание объекта
Cofee_Machina now = new Cofee_Machina();
label1.Visible = true;
// для работы с комбобоксом
switch (comboBox1.SelectedIndex)
{
case 0:
label1.Text = now.Espresso_1();
pictureBox2.Visible = true;
break;
case 1:
label1.Text = now.Capuchino_1();
pictureBox1.Visible = true;
break;
case 2:
label1.Text = now.Capuchino_sugar();
pictureBox4.Visible = true;
break;
case 3:
label1.Text = now.Capuchino_chocolate();
pictureBox5.Visible = true;
break;
case 4:
label1.Text = now.Capuchino_s_c();
pictureBox6.Visible = true;
break;
}
}
}
}
Блок-схема:
Начало
now
= new Cofee_Machina()
Case
0
now.Espresso_1();
Case
1 now.Capuchino_1();
Case
2 now.Capuchino_Sugar();
Case
4 now.Capuchino_Chocolate();
Case
3 now.Capuchino_s_c();
Конец
Фасад Cofee_Machina: Класс Base:
Начало
Начало
Base
espresso = new
Espresso();
Continue=”
” CDecorator d = new CDecorator();
Base
capuchino = new
Milk_Decorator(new
Espresso());
Get_Start() return
Continue;
Base
capuchino_sugar = new
Sugar_Decorator(new
Milk_Decorator(new
Espresso()));
Espresso() Continue
= “Вы выбрали крепкий кофе” Base
capuchino_chocolate = new
Chocolate_Decorator(new
Milk_Decorator(new
Espresso())); Base
capuchino_s_ch = new
Chocolate_Decorator(new
Sugar_Decorator(new
Milk_Decorator(new
Espresso())));
Конец
Начало
Конец
Начало
Base
base1
CDecorator d = new CDecorator(); Milk_Decorator(Base
_base) base1
= _base; Continue
+= base1.Get_Start() + "
с
молоком";
Конец
Конец
Результат выполнения:
Вывод:
Для реализации паттернов была выбрана абстракция Кофемашины. Был создан базовый класс Base, который являлся классом родителем. От него был унаследован класс Espresso со своими методами и полями. Так как подразумевалось, что остальные классы должны создаваться на основе класса Espresso, то были реализованы декораторы, которые позволили создавать новые объекты с тем функционалом, который выбирал пользователь. Для начала был создан абстрактный класс декоратора Decorator_Base для проверки совместимости типов, который наследовался от класса Base. Путём конструкции от абстрактного класса были реализованы декораторы Milk_Decorator, Sugar_Decorator, Chocolate_Decorator. Для улучшения восприятия кода пользователем был применён фасад Cofee_Machina, который собирал разрозненные классы в один интерфейс, позволяя скрыть небольшую громоздкость реализации. В программе использовалась одна кнопка и один comboBox, в котором выбирался напиток, созданный путём применения декораторов к классу Espresso.