С точки зрения моделирования предметной области, агрегация предназначена для моделирования сложной системы, которая включает в себя более простые подсистемы или неделимые части. Другими словами, агрегация раскрывает организацию системы по принципу «целое à часть» и показывает, из каких частей состоит система и как они взаимосвязаны.
Две основных разновидности агрегации:
- собственно агрегация (агрегация)
Части представляют собой самостоятельные объекты, которые создаются независимо от целого и затем объединяются в единую систему. Уничтожение системы не сопровождается уничтожением частей. Они продолжают самостоятельное существование.
- композиция
Части представляют собой объекты, которые создаются при создании системы. Вне рамок целого части самостоятельно не существуют, при уничтожении системы, части уничтожаются.
Деление системы на составные части представляет собой иерархию: на верхнем уровне – целое, на нижних – части.
С точки зрения технологии программирования, агрегация представляет собой реализацию идеи повторного использования кода. Код, реализующий класс-часть, в готовом виде, без изменений, может быть использован в классе-контейнере.
Механизм реализации: полю класса-контейнера назначается тип класса-части.
Агрегация на основе классов
При реализации агрегации на основе классов необходимо исходить из того факта, что класс относится к ссылочным типам, т.е. имя объекта – ссылка на область памяти, где хранится объект. Следовательно типичная схема будет иметь вид:
Изменение состояния объекта-части вне рамок объекта-контейнера немедленно изменяет состояние контейнера.
Базовый пример
Определить сущность «осветительный прибор», частями которого являются «корпус» и «лампочки». Осветительный прибор собирается из отдельно купленных частей и должен допускать их замену.
class Корпус
{
private string тип; // тип корпуса
private double цена;
public string Тип
{
set { тип = value; }
get { return тип; }
}
private double Цена
{
set { цена = value; }
get { return цена; }
}
}
class Лампочка
{
private double мощность;
private double цена;
public double Мощность
{
set { мощность = value; }
get { return мощность; }
}
public double Цена
{
set { цена = value; }
get { return цена; }
}
}
class Прибор
{
private Корпус кор;
private Лампочка лам;
private string состояние; //включено или выключено
//конструктор
public Прибор(Корпус кор, Лампочка лам, string состояние)
{
this.кор = кор;
this.лам = лам;
this.состояние = состояние;
}
//свойство
public string Состояние
{
set { Состояние = value; }
}
//вывести данные
public void Показать()
{
Console.WriteLine("{0} {1} {2} {3} {4} {5}", состояние, кор.Тип, кор.Цена, лам.Цена, лам.Мощность);
}
}
В основной программе соберем осветительный прибор из корпуса типа «Тюльпан» ценой 800 рублей и лампочки мощностью 60 Вт, ценой 30 рублей.
class Корпус
{
private string тип; // тип корпуса
private double цена;
public string Тип
{
set { тип = value; }
get { return тип; }
}
public double Цена
{
set { цена = value; }
get { return цена; }
}
}
class Лампочка
{
private double мощность;
private double цена;
public double Мощность
{
set { мощность = value; }
get { return мощность; }
}
public double Цена
{
set { цена = value; }
get { return цена; }
}
}
class Прибор
{
private Корпус кор;
private Лампочка лам;
private string состояние; //включено или выключено
//конструктор
public Прибор(Корпус кор, Лампочка лам, string состояние)
{
this.кор = кор;
this.лам = лам;
this.состояние = состояние;
}
//свойство
public string Состояние
{
set { состояние = value; }
}
//вывести данные
public void Показать()
{
Console.WriteLine("{0}, {1}, {2}, {3}, {4}, {5}", состояние, кор.Тип, кор.Цена, лам.Цена, лам.Мощность);
}
}
class Program
{
static void Main()
{//1. объявляем ссылки
Корпус к;
Лампочка л;
Прибор п;
//2. создаем объкты
к = new Корпус();
к.Тип = "Тюльпан";
к.Цена = 800.0;
л = new Лампочка();
л.Мощность = 60.0;
л.Цена = 30.0;
//3., 4. контейнер
п = new Прибор(к, л, "Включено");
п.Показать();
//меняем лампочку
л.Мощность = 200.0;
п.Показать();
}
Дата: 2019-02-02, просмотров: 287.