паттерны программирования
Post on 13-Nov-2014
5.893 Views
Preview:
DESCRIPTION
TRANSCRIPT
Code better 2
Паттерны программирования
Что такое паттерны?..
―Устойчивый узнаваемый способ или подход к решению часто встречающихся проблем ООП.
• Позволяют легко идентифицировать проблему и ее решение буквально словом или словосочетанием.
• Определяют эффективное и зарекомендовавшее себя решение.
• Позволяют улучшить качество документации и сопровождения существующих систем.
Рассматриваемые паттерны
• Фабричный метод (Factory Method)• Одиночка (Singleton)• Итератор (Iterator)• Адаптер/обертка (Adapter/Wrapper)• Прототип (Prototype)• Компоновщик (Composite)
Фабричный метод (назначение)
• Определяет интерфейс для создания объектов, при этом выбранный класс инстанциируется подклассами.
• Предоставляет подклассам операции-зацепки (hooks)
• Соединяет параллельные иерархии
Фабричный метод (схема)
Фабричный метод (пример кода)using System;using System.Collections;
class FactoryPattern{
interface IProduct {string ShipFrom();
}class ProductA : IProduct {
public String ShipFrom() {return " from South Africa";
}}class ProductB : IProduct {
public String ShipFrom() {return "from Spain";
}}class DefaultProduct : IProduct {
public String ShipFrom() {return "not available";
}}class Creator {
public IProduct FactoryMethod(int month) {if (month >= 4 && month <= 11)
return new ProductA();else
if (month == 1 || month == 2 || month == 12) { return new ProductB(); } else { return new DefaultProduct(); }}
}static void Main() {
Creator c = new Creator();IProduct product;
for (int i = 1; i <= 12; i++) {product = c.FactoryMethod(i);Console.WriteLine("Avocados " + product.ShipFrom());
}}
}
Одиночка (назначение)
• Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.
• Большая гибкость чем у статических членов класса.
• Допускает переменное число экземпляров.• Допускает уточнение операций.• Уменьшает число имен.
Одиночка (схема)
Одиночка (пример кода)public class Singleton {
// Private constructorSingleton() { }
// Nested class for lazy instantiationclass SingletonCreator {
static SingletonCreator() { }
// Private object instantiated with private constructorinternal static readonly Singleton uniqueInstance = new Singleton();
}
// Public static property to get the objectpublic static Singleton UniqueInstance {
get { return SingletonCreator.uniqueInstance; }}
}
Итератор (назначение)
• Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего строения.
• Поддерживает различные виды обхода агрегата.
• Одновременно для агрегата может быть активно несколько обходов.
Итератор (схема)
Итератор (пример кода)using System;using System.Collections;class IteratorPattern {
class MonthCollection : IEnumerable {string[] months = { "January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"};
public IEnumerator GetEnumerator() {// Generates values from the collectionforeach (string element in months)
yield return element;}
}
static void Main() {MonthCollection collection = new MonthCollection();// Consumes values generated from collection's GetEnumerator methodforeach (string n in collection)
Console.Write(n + " ");Console.WriteLine("\n");
}}
Адаптер (назначение)
• Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты.
Адаптер (схема)
Адаптер (пример кода)using System;
// Existing way requests are implementedclass Adaptee {
// Provide full precisionpublic double SpecificRequest(double a, double b) {
return a / b;}
}
// Required standard for requestsinterface ITarget {
// Rough estimate requiredstring Request(int i);
}
// Implementing the required standard via Adapteeclass Adapter : Adaptee, ITarget {
public string Request(int i) {return "Rough estimate is " + (int) Math.Round(SpecificRequest(i, 3));
}}
class Client {static void Main() {
// Showing the Adapteee in standalone modeAdaptee first = new Adaptee();Console.Write("Before the new standard\nPrecise reading: ");Console.WriteLine(first.SpecificRequest(5, 3));
// What the client really wantsITarget second = new Adapter();Console.WriteLine("\nMoving to the new standard");Console.WriteLine(second.Request(5));
}}
Прототип (назначение)
• Задает виды создаваемых объектов с помощью экземпляра-прототипа, и создает новые объекты путем копирования этого прототипа.
• Добавление и удаление продуктов во время выполнения.
• Спецификация новых объектов путем изменения значений или структуры.
• Динамическое конфигурирование приложения классами.
Прототип (схема)
Прототип (пример кода)using System;using System.Collections.Generic;using System.Runtime.Serialization;using System.Runtime.Serialization.Formatters.Binary;
[Serializable()]public abstract class IPrototype<T> {
// Shallow copypublic T Clone() {
return (T) this.MemberwiseClone();}
// Deep Copypublic T DeepCopy() {
MemoryStream stream = new MemoryStream();BinaryFormatter formatter = new BinaryFormatter();formatter.Serialize(stream, this);stream.Seek(0, SeekOrigin.Begin);T copy = (T) formatter.Deserialize(stream);stream.Close();return copy;
}}
Компоновщик (назначение)
• Компонует объекты в древовидные структуры для представления иерархии часть-целое. Позволяет клиентам единообразно трактовать индивидуальные и составные объекты.
• Упрощает архитектуру клиента.• Облегчает добавление новых видов
компонентов.• Способствует созданию общего дизайна.
Компоновщик (схема)
Компоновщик (пример кода)public class Component<T> : IComponent<T> {
public T Name { get; set;}public Component(T name) {
Name = name;}
public void Add(IComponent<T> c) {Console.WriteLine("Cannot add to an item");
}public IComponent<T> Remove(T s) {
Console.WriteLine("Cannot remove directly");return this;
}public IComponent<T> Find(T s) {
return (s.Equals(Name)) ? this : null;}
}
public class Composite<T> : IComponent<T> {List<IComponent<T>> list;public T Name { get; set;}
public Composite(T name) {Name = name;list = new List<IComponent<T>>();
}public void Add(IComponent<T> c) {
list.Add(c);}
IComponent<T> holder = null;public void Remove(T s) {
...(holder as Composite<T>).list.Remove(Find(s));
}
public IComponent<T> Find(T s) {...return found;
}}
Литература
• Judith Bishop. C# 3.0 Design Patterns• Гамма, Хелм, Джонсон и др. Приемы
объектно-ориентированного программирования: паттерны программирования
• Buschmann, Henney, Schmidt. Pattern-Oriented Software Architecture.
• Christopher Lasater. Design Patterns.
top related