Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы / Лабораторная работа 2 / ПКРПСиБД LAB2 Бочаров И.А..docx
Скачиваний:
22
Добавлен:
28.06.2014
Размер:
276.11 Кб
Скачать

Uml-диаграмма классов

Диаграмма последовательностей

Использованная литература

  1. http://en.wikipedia.org/wiki/Marker_interface_pattern

Контейнер свойств

Категория шаблона

Данный шаблон относится к категории фундаментальных.

Описание

Функция шаблона «Контейнер свойств» состоит в том, чтобы приложение, уже построенное и развернутое, могло динамически расширяться.

Уместность применения

Данный шаблон хорошо подходит для определенных типов приложений.

Преимущества применения данного шаблона

Применение шаблона позволяет расширять при необходимости классы приложения, добавляя в них дополнительные данные. Так, использование шаблона дает нам механизм для динамического расширения объекта свойствами во время выполнения.

Недостатки шаблона

Интерфейс класса описывает его содержимое не полностью, поэтому при добавлении свойств приходится дополнительно модифицировать классы, которые используют этот контейнер. Зачастую применение этого шаблона влечет проблемы при необходимости сериализации объекта.

Детали реализации

IPropertyContainer.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Patterns

{

public interface IPropertyContainer

{

void SetProperty(string name, object value);

void RemoveProperty(string name);

object GetProperty(string name);

List<String> GetAllPropertiesNames();

}

}

PropertyContainer.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Patterns

{

public abstract class PropertyContainer:IPropertyContainer

{

protected Dictionary<string, object> Properties;

public PropertyContainer() {

Properties = new Dictionary<string, object>();

}

public PropertyContainer(Dictionary<string, object> prop) {

this.Properties = prop;

}

public void SetProperty(string key, object value) {

try {

Properties[key] = value;

}

catch(KeyNotFoundException){

Properties.Add(key,value);

}

}

public object GetProperty(string name) {

try {

return Properties[name];

}

catch(KeyNotFoundException) {

return null;

}

}

public void RemoveProperty(string name) {

try

{

Properties.Remove(name);

}

catch (KeyNotFoundException)

{

}

}

public List<string> GetAllPropertiesNames() {

return Properties.Keys.ToList();

}

public override string ToString()

{

string result= "";

foreach (KeyValuePair<string,object> kvp in this.Properties) {

result += kvp.Key + ": "+kvp.Value.ToString()+Environment.NewLine;

}

return result;

}

}

}

PizzaContainer.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Patterns

{

public enum PASTRY_TYPE {THIN, THICK, MIDDLE}

public class PizzaContainer:PropertyContainer

{

public string Cheese

{

get { return (string)GetProperty("cheese"); }

set

{

SetProperty("cheese", value);

}

}

public PASTRY_TYPE PastryType

{

get { return (PASTRY_TYPE)GetProperty("pastrytype"); }

set { SetProperty("pastrytype", value); }

}

public override string ToString()

{

string result = "Pizza Info:" + Environment.NewLine;

result+=base.ToString();

return result;

}

}

}

Program.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Patterns;

namespace PropertyContainer

{

class Program

{

static void Main(string[] args)

{

PizzaContainer pizza = new PizzaContainer();

pizza.Cheese = "Mozarella";

pizza.PastryType = PASTRY_TYPE.THICK;

pizza.SetProperty("tomato",true);

Console.WriteLine(pizza.ToString());

Console.ReadLine();

}

}

}