22
Code better 2 Паттерны программирования

паттерны программирования

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: паттерны программирования

Code better 2

Паттерны программирования

Page 2: паттерны программирования

Что такое паттерны?..

―Устойчивый узнаваемый способ или подход к решению часто встречающихся проблем ООП.

• Позволяют легко идентифицировать проблему и ее решение буквально словом или словосочетанием.

• Определяют эффективное и зарекомендовавшее себя решение.

• Позволяют улучшить качество документации и сопровождения существующих систем.

Page 3: паттерны программирования

Рассматриваемые паттерны

• Фабричный метод (Factory Method)• Одиночка (Singleton)• Итератор (Iterator)• Адаптер/обертка (Adapter/Wrapper)• Прототип (Prototype)• Компоновщик (Composite)

Page 4: паттерны программирования

Фабричный метод (назначение)

• Определяет интерфейс для создания объектов, при этом выбранный класс инстанциируется подклассами.

• Предоставляет подклассам операции-зацепки (hooks)

• Соединяет параллельные иерархии

Page 5: паттерны программирования

Фабричный метод (схема)

Page 6: паттерны программирования

Фабричный метод (пример кода)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());

}}

}

Page 7: паттерны программирования

Одиночка (назначение)

• Гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа.

• Большая гибкость чем у статических членов класса.

• Допускает переменное число экземпляров.• Допускает уточнение операций.• Уменьшает число имен.

Page 8: паттерны программирования

Одиночка (схема)

Page 9: паттерны программирования

Одиночка (пример кода)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; }}

}

Page 10: паттерны программирования

Итератор (назначение)

• Предоставляет способ последовательного доступа ко всем элементам составного объекта, не раскрывая его внутреннего строения.

• Поддерживает различные виды обхода агрегата.

• Одновременно для агрегата может быть активно несколько обходов.

Page 11: паттерны программирования

Итератор (схема)

Page 12: паттерны программирования

Итератор (пример кода)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");

}}

Page 13: паттерны программирования

Адаптер (назначение)

• Преобразует интерфейс одного класса в интерфейс другого, который ожидают клиенты.

Page 14: паттерны программирования

Адаптер (схема)

Page 15: паттерны программирования

Адаптер (пример кода)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));

}}

Page 16: паттерны программирования

Прототип (назначение)

• Задает виды создаваемых объектов с помощью экземпляра-прототипа, и создает новые объекты путем копирования этого прототипа.

• Добавление и удаление продуктов во время выполнения.

• Спецификация новых объектов путем изменения значений или структуры.

• Динамическое конфигурирование приложения классами.

Page 17: паттерны программирования

Прототип (схема)

Page 18: паттерны программирования

Прототип (пример кода)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;

}}

Page 19: паттерны программирования

Компоновщик (назначение)

• Компонует объекты в древовидные структуры для представления иерархии часть-целое. Позволяет клиентам единообразно трактовать индивидуальные и составные объекты.

• Упрощает архитектуру клиента.• Облегчает добавление новых видов

компонентов.• Способствует созданию общего дизайна.

Page 20: паттерны программирования

Компоновщик (схема)

Page 21: паттерны программирования

Компоновщик (пример кода)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;

}}

Page 22: паттерны программирования

Литература

• Judith Bishop. C# 3.0 Design Patterns• Гамма, Хелм, Джонсон и др. Приемы

объектно-ориентированного программирования: паттерны программирования

• Buschmann, Henney, Schmidt. Pattern-Oriented Software Architecture.

• Christopher Lasater. Design Patterns.