
Национальный Исследовательский Университет
МОСКОВСКИЙ ЭНЕРГЕТИЧЕСКИЙ ИНСТИТУТ
Институт автоматики и вычислительной техники
Кафедра прикладной математики
Лабораторная работа № 2
Реализация шаблона проектирования
Курс «Проектирование крупных распределенных программных систем и баз данных»
Выполнил
студент группы А-13-08
Захаров Антон
Преподаватель
Куриленко Иван Евгеньевич
Москва, 2012
Цель работы
Научиться применять базовые шаблоны проектирования.
Порядок выполнения работы
С использованием одного из языков программирования из множества (C++, C#, Java) реализовать следующие шаблоны проектирования:
Неизменяемый объект
Маркерный интерфейс
Контейнер свойств
Шаблон делегирования
Разработать UML модель.
Требования
Наличие работающей демонстрационной программы с исходным кодом.
Наличие UML-модели в электронном виде, иллюстрирующей шаблон, полученной с помощью специализированного диаграммера (Rational Enterprise Architect, Visual Paradigm, Visual Studio).
Наличие отчёта в печатном виде, содержащего теоретическое введение, UML-модель и исходный код.
Неизменяемый объект
Основные шаблоны
Описание
Неизменяемый объект (англ. Immutableobject) – шаблон для создания объектов, которые не могут быть изменены после их создания. Объект может быть неизменяемым как полностью, так и частично. В некоторых случаях объект считается неизменяемым с точки зрения пользователя класса, даже если изменяются его внутренние поля.
Уместность применения
Шаблон следует применять, если требуется обезопасить объект от явного и неявного изменения его свойств.
Преимущества, достигаемые при применении шаблона
Гарантия сохранения состояния объекта, в котором он находился на момент создания.
Поскольку нет опасности, что неизменяемые объекты изменят своё значение, можно свободно кэшировать ссылки на них и быть уверенным, что эта ссылка обратится к этому же значению позже. Соответственно, поскольку их свойства не могут измениться, можно кэшировать их поля и результаты их методов.
С неизменяемыми объектами легче работать, чем с изменяемыми. Они могут быть только в одном состоянии и поэтому всегда согласованы, и к ним легко организовать совместный доступ.
Недостатки шаблона
Если в какой-то момент времени существования объекта, возникнет необходимость дать право на изменение определённых свойств объекта объектам другого класса, придётся полностью отказаться от идеи неизменяемости.
Не возможно быть абсолютно уверенным, что не возникнет необходимости, описанной в 1 пункте.
Детали реализации
Шаблон реализуется следующим образом:
using System;
using System.Text;
public interface IImmutable
{
bool isImmutable { get; }
void makeImmutable();
}
public abstract class Immutable : IImmutable
{
private bool immutable;
public bool isImmutable {
get { return immutable; }
}
public void makeImmutable() {
immutable = true;
}
protected void checkImmutable() {
if (immutable)
throw new Exception("Ошибка! Нельзя менять значения свойств неизменяемых объектов");
}
}
namespace Lab2_1
{
public class Planet : Immutable
{
private string name;
private double mass;
private double g;
public string Name {
get { return name; }
set { checkImmutable(); name = value; }
}
public double M {
get { return mass; }
set { checkImmutable(); mass = value; }
}
public double G {
get { return g; }
set { checkImmutable(); g = value; }
}
public Planet(string name, double M, double g) {
this.name = name;
this.mass = M;
this.g = g;
makeImmutable();
}
}
class Program
{
static void Main(string[] args) {
Planet earth = new Planet("Земля", 5.9736 * Math.Pow(10, 24), 9.780327);
Console.WriteLine("Масса Земли " + earth.M + " кг");
Console.WriteLine("Пытаемся изменить массу планеты");
try {
earth.M = 10000000000;
}
catch (Exception e) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(e.Message);
Console.ResetColor();
}
Console.WriteLine("Масса Земли " + earth.M + " кг");
Console.ReadLine();
}
}
}