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

Содержание

Слайд 2

Patterns

Що таке патерн (pattern)?

Alexander C., Ishikawa S., Silverstein M. A Pattern Language:

Patterns Що таке патерн (pattern)? Alexander C., Ishikawa S., Silverstein M. A
Towns/ Buildings/ Construction, NY, 1977.
Alexander C., Ishikawa S., Silverstein M. The Timeless Way of Buildings, NY, 1979.

За Кристофером Олександером, будь-який патерн описує задачу, що постійно постає та розв'язується, застосовуючи один і той же прийом так, що він стає у нагоді тисячі, мільйони разів і не потребує нічого нового.
Хоча Олександер мав на увазі патерни, що виникають при проектуванні архітектурних споруд, його підхід залишається справедливим й для патернів ОО проектування.
Патерн – це типове вирішення типової проблеми у даному контексті.

Слайд 3

Patterns

GoF (Gang of Four).

Gamma E., Johnson R., Helm R., Vlissides J. Design

Patterns GoF (Gang of Four). Gamma E., Johnson R., Helm R., Vlissides
Patterns. Elements of Reusable Object-Oriented Software. — Addison-Wesley, 1995.
Гамма Э., Хелм Р., Джонсон Р., Влиссидес Дж. Приемы объектно-ориентированного проектирования. Паттерны проектирования. СПб: Питер, 2001. — 368 с.

Шаллоуей А., Тротт Дж. Шаблоны проектирования. — ИД “Вильямс”, 2002.

Слайд 4

Patterns

http://www.dofactory.com

Рекомендовано!

Patterns http://www.dofactory.com Рекомендовано!

Слайд 5

Patterns

http://sourcemaking.com/design_patterns

Ілюстрації!

Patterns http://sourcemaking.com/design_patterns Ілюстрації!

Слайд 6

Patterns

http://www.citforum.ru/SE/project/pattern/ (1/2)

Patterns http://www.citforum.ru/SE/project/pattern/ (1/2)

Слайд 7

Patterns

http://www.citforum.ru/SE/project/pattern/ (2/2)

Patterns http://www.citforum.ru/SE/project/pattern/ (2/2)

Слайд 8

Patterns

GRASP (General Responsibility Assignment Software Patterns)

Craig Larman Applying UML and Patterns

К. Ларман.

Patterns GRASP (General Responsibility Assignment Software Patterns) Craig Larman Applying UML and
Применение UML и паттернов проектирования. М. , Вильямс, 2002.

Слайд 9

Patterns

Джон Влиссидес. Применение шаблонов проектирования - Дополнительные штрихи - Вильямс, 2003

Джон Влиссидес.

Patterns Джон Влиссидес. Применение шаблонов проектирования - Дополнительные штрихи - Вильямс, 2003
Применение шаблонов проектирования - Дополнительные штрихи - Вильямс, 2003

Книга (1998) одного з членів GoF.

Марк Гранд. Шаблоны проектирования в JAVA. Каталог популярных шаблонов проектирова-ния, проиллюстрированных при помощи UML, 2002

Слайд 10

Patterns

Анти-патерни

Patterns Анти-патерни

Слайд 11

Patterns

Структура патернів GoF

У загальному випадку опис патерну складається з чотирьох основних розділів:
1.

Patterns Структура патернів GoF У загальному випадку опис патерну складається з чотирьох
Ім'я. Пославшись на нього, можна одразу описати як проблему проектування, так і її вирішення (словник патернів). Отже, проектування ПС можна проводити більш високому рівні абстракції. Патерн — це одне з ключових понять архітектури ПС.
Знаходження виразних імен було однією з найскладніших задач при складанні каталогу GoF (Gang of Four).
2. Задача. Опис того, коли варто застосовувати патерн. Необхідно сформулювати задачу та її контекст. Тут може описуватися конкретна проблема проектування, може включатися перелік умов, при виконанні яких має сенс застосовувати даний патерн. (Важливо знати, де і при яких умовах можна скористатись патерном.)

Слайд 12

Patterns

Структура патернів

3. Розв'язок . Абстрактний опис задачі проектування і того, як вона

Patterns Структура патернів 3. Розв'язок . Абстрактний опис задачі проектування і того,
може бути розв'язана за допомогою деякого узагальненого сполучення класів чи об'єктів.
4. Результати. Описуються наслідки застосування патерну, різного роду компроміси, аналізується вибір мови реалізації. Хоча при опису проектних рішень про наслідки часто не згадують, знати про них необхідно, щоб можна було оцінити переваги і недоліки даного патерну у порівнянні з іншими.
Оскільки повторне використання є важливим фактором для ПС, то до результатів варто відносити вплив на гнучкість, масштабування, портабельність розроблюваної системи.

Слайд 13

Patterns

До класифікації патернів

Породжуючі патерни – пов'язані з процесом створення об'єктів.
Структурні патерни –

Patterns До класифікації патернів Породжуючі патерни – пов'язані з процесом створення об'єктів.
ґрунтуються на композиціях (структурних об'єднаннях) об'єктів чи класів. (Теза: замість успадкування – композиції).
Патерни поведінки – характеризуються взаємодією об'єктів між собою (такі патерни можна розглядати як кооперації UML).

Слайд 14

Patterns

Простір патернів проектування

Cтруктурні патерни рівня об'єкта компонують об'єкти для одержання нової функціональності.

Patterns Простір патернів проектування Cтруктурні патерни рівня об'єкта компонують об'єкти для одержання
Додаткова гнучкість пов'язана з можливістю створювати композицію об'єктів під час виконання програми.

Слайд 15

Patterns

Singleton (data & object factory™, dofactory.com)

Гарантує, що є тільки один екземпляр класу,

Patterns Singleton (data & object factory™, dofactory.com) Гарантує, що є тільки один
і надає глобальну точку доступу до такого екземпляра.

class Singleton
{
// Fields
private static Singleton instance;
// Constructor
protected Singleton() {}
// Methods
public static Singleton Instance()
{
// Uses "Lazy initialization"
if( instance == null )
instance = new Singleton();
return instance;
}
}

Слайд 16

Patterns

using System;
// "Singleton"
class Singleton
{
// Fields
private static Singleton instance;
//

Patterns using System; // "Singleton" class Singleton { // Fields private static
Constructor
protected Singleton() {}
// Methods
public static Singleton Instance()
{
// Uses "Lazy initialization"
if( instance == null )
instance = new Singleton();
return instance;
}
}

/// Client test
public class Client
{
public static void Main()
{
// Constructor is protected - cannot use new
Singleton s1 = Singleton.Instance();
Singleton s2 = Singleton.Instance();
if( s1 == s2 )
Console.WriteLine( "The same instance" );
Console.Read();
}
}

Singleton (data & object factory™, dofactory.com)

Слайд 17

Patterns

Adapter

http://sourcemaking.com/design_patterns

Patterns Adapter http://sourcemaking.com/design_patterns

Слайд 18

Patterns

Adapter

Дозволяє перейти від одного інтерфейсу (у класі чи в об'єкті) до іншого

Patterns Adapter Дозволяє перейти від одного інтерфейсу (у класі чи в об'єкті)
з метою забезпечити спільну роботу (класів чи об'єктів), яка була б неможлива без даного патерна через несумісність інтерфейсів.

Відомий також під іменем Wrapper (обгортка).

Слайд 19

Patterns

Adapter

Patterns Adapter

Слайд 20

Patterns

Adapter (GoF)

Patterns Adapter (GoF)

Слайд 21

Patterns

Borland Developer Studio 2006. Adapter

Patterns Borland Developer Studio 2006. Adapter

Слайд 22

Patterns

Borland Developer Studio 2006. Adapter

Patterns Borland Developer Studio 2006. Adapter

Слайд 23

Patterns

Borland Developer Studio 2006

Patterns Borland Developer Studio 2006

Слайд 24

Patterns

Adapter (data & object factory™, dofactory.com)

Patterns Adapter (data & object factory™, dofactory.com)

Слайд 25

Patterns

Adapter (data & object factory™, dofactory.com)

// "Adaptee"
class Adaptee
{
// Methods
public void

Patterns Adapter (data & object factory™, dofactory.com) // "Adaptee" class Adaptee {
SpecificRequest()
{
Console.WriteLine("Called SpecificRequest()" );
}
}
/// Client test
public class Client
{
public static void Main(string[] args)
{
// Create adapter and place a request
Target t = new Adapter();
t.Request();
}
}

using System;
// "Target"
class Target
{
// Methods
virtual public void Request()
{
// Normal implementation goes here
}
}
// "Adapter"
class Adapter : Target
{
// Fields
private Adaptee adaptee = new Adaptee();
// Methods
override public void Request()
{
// Possibly do some data manipulation
// and then call SpecificRequest
adaptee.SpecificRequest();
}
}

Слайд 26

Patterns

Adapter

adaptee: Adaptee

t:Adapter

override public void Request()
{
// Possibly do some data

Patterns Adapter adaptee: Adaptee t:Adapter override public void Request() { // Possibly
manipulation
// and then call SpecificRequest
adaptee.SpecificRequest();
}

Слайд 27

Patterns

Proxy

http://sourcemaking.com/design_patterns

Patterns Proxy http://sourcemaking.com/design_patterns

Слайд 28

Patterns

Proxy (data & object factory™, dofactory.com)

Виступає сурогатом (заступником) іншого об'єкта, “контролюючи” доступ

Patterns Proxy (data & object factory™, dofactory.com) Виступає сурогатом (заступником) іншого об'єкта, “контролюючи” доступ до нього.
до нього.

Слайд 29

Patterns

Proxy (data & object factory™, dofactory.com)

// "Proxy"
class Proxy : Subject

Patterns Proxy (data & object factory™, dofactory.com) // "Proxy" class Proxy :
{
RealSubject realSubject;
public override void Request()
{
// Use 'lazy initialization'
if (realSubject == null)
{
realSubject = new RealSubject();
}
realSubject.Request();
}
}

class MainApp
{
static void Main()
{
// Create proxy and request a service
Proxy proxy = new Proxy();
proxy.Request();
Console.Read(); // Wait for user
}
}
// "Subject"
abstract class Subject
{
public abstract void Request();
}
// "RealSubject"
class RealSubject : Subject
{
public override void Request()
{
Console.WriteLine("Called RealSubject.Request()");
}
}

Слайд 30

Patterns

Decorator

Декоратор – патерн, що структурує об'єкти. Динамічно додаються об'єкту нові обов'язки. Є

Patterns Decorator Декоратор – патерн, що структурує об'єкти. Динамічно додаються об'єкту нові
гнучкою альтернативою породженню підкласів з метою розширення функціональності.

Теза: замість успадкування – композиції

Завдання для студентів: створити конкретний об'єкт, що “підтримує” три “декорації”, наприклад, CBorderDecorator, CInterierDecorator, CMyDecorator.

Пригадаємо… “Додаткова гнучкість пов'язана з можливістю задавати композицію об'єктів під час виконання програми”.

Запитання студентам: як можна отримати розв'язок із використан-ням успадкування ?

Слайд 31

Patterns

Decorator

Patterns Decorator

Слайд 32

Patterns

Decorator (data & object factory™, dofactory.com)

Patterns Decorator (data & object factory™, dofactory.com)

Слайд 33

Patterns

Decorator. Приклад (1/2) (data & object factory™, dofactory.com)

using System;
abstract class Component
{abstract public

Patterns Decorator. Приклад (1/2) (data & object factory™, dofactory.com) using System; abstract
void Operation();
}
class ConcreteComponent : Component
{override public void Operation()
{ Console.WriteLine ("ConcreteComponent.Operation()");
}
}
abstract class Decorator : Component
{protected Component component;
public void SetComponent( Component component )
{ this.component = component;
}
override public void Operation()
{ if( component != null )
component.Operation();
}
}

class ConcreteDecoratorA : Decorator
{private string addedState;
override public void Operation()
{ base.Operation();
addedState = "new state";
Console.WriteLine
("ConcDecoratorA.Operation()");
}
}
class ConcreteDecoratorB : Decorator
{override public void Operation()
{ base.Operation();
AddedBehavior();
Console.WriteLine ("ConcDecoratorB.Operation()");
}
void AddedBehavior() { }
}

public class Client
{ public static void Main ( string[] args ) { ConcreteComponent c = new ConcreteComponent();
ConcreteDecoratorA d1 = new ConcreteDecoratorA();
ConcreteDecoratorB d2 = new ConcreteDecoratorB();
// Link decorators
d1.SetComponent( c );
d2.SetComponent( d1 );
d2.Operation();
}
}

Слайд 34

Patterns

Decorator. Приклад (2/2)

class ConcreteDecoratorB : Decorator
{override public void Operation()
{ base.Operation();
//

Patterns Decorator. Приклад (2/2) class ConcreteDecoratorB : Decorator {override public void Operation()
Decor B
}
}

d2 : CDecB component= d1 : CDecA component= c : CComponent

abstract class Decorator
{protected Component component;
. . .
override public void Operation()
{ if( component != null )
component.Operation();
}
}

// Link decorators
d1.SetComponent( c );
d2.SetComponent( d1 );
d2.Operation();

“Додаткова гнучкість пов'язана з можливістю створювати композицію об'єктів під час виконання програми”.

Слайд 35

Patterns

Spring-проект dekor

Вигляд проекту dekor (проект містить три класи конкретних декораторів (DecoratorA, DecoratorB,

Patterns Spring-проект dekor Вигляд проекту dekor (проект містить три класи конкретних декораторів
DecoratorC)

Середовище Eclipse +Spring Plugin

Слайд 36

Patterns

public class DecoratorA extends Decorator {
public void operation(){
super.operation();
System.out.println("DecoratorA");
}
}

Patterns public class DecoratorA extends Decorator { public void operation(){ super.operation(); System.out.println("DecoratorA");
“Дротяна модель” та виконання проекту

public class Decorator implements IComponent{
private IComponent component;
public void setComponent(IComponent component){
this.component = component;
}
public void operation(){
component.operation();
}
}

Слайд 37

Patterns

Composite (композитор, компоновник)

Групує об'єкти в деревоподібні структури для представлення ієрархій типу “частина-ціле”.

Patterns Composite (композитор, компоновник) Групує об'єкти в деревоподібні структури для представлення ієрархій
Дозволяє уніфікувати дії як з листками, так і з будь-якими групами піддерев.

Слайд 38

Patterns

Composite (data & object factory™, dofactory.com)

Patterns Composite (data & object factory™, dofactory.com)

Слайд 39

Patterns

Composite (data & object factory™, dofactory.com)

class Leaf : Component
{public Leaf( string name

Patterns Composite (data & object factory™, dofactory.com) class Leaf : Component {public
) : base( name ) {} // Constructor
public override void Add( Component c )
{ Console.WriteLine("Cannot add to a leaf");
}
public override void Remove( Component c )
{ Console.WriteLine("Cannot remove from a leaf");
}
public override void Display( int depth )
{ Console.WriteLine( new String( '-', depth ) + name );
}
}
public class Client
{ public static void Main( string[] args )
{ // Create a tree structure
Composite root = new Composite( "root" );
root.Add( new Leaf( "Leaf A" ));
root.Add( new Leaf( "Leaf B" ));
Composite comp = new Composite( "Composite X" );
comp.Add( new Leaf( "Leaf XA" ) );
comp.Add( new Leaf( "Leaf XB" ) );
root.Add( comp );
root.Add( new Leaf( "Leaf C" ));
// Recursively display nodes
root.Display( 1 );
}
}

using System;
using System.Text;
using System.Collections;
abstract class Component
{ protected string name;
public Component( string name ) // Constructor
{ this.name = name;
}
abstract public void Add(Component c);
abstract public void Remove( Component c );
abstract public void Display( int depth );
}
class Composite : Component
{private ArrayList children = new ArrayList();
// Constructor
public Composite( string name ) : base( name ) {}
public override void Add( Component component )
{ children.Add( component );
}
public override void Remove( Component component )
{ children.Remove( component );
}
public override void Display( int depth )
{ Console.WriteLine( new String( '-', depth ) + name );
// Display each of the node's children
foreach( Component component in children )
component.Display( depth + 2 );
}
}

Слайд 40

Patterns

Strategy (dofactory.com)

Визначає сімейство алгоритмів, в якому інкапсулюється кожен з них і забезпечується

Patterns Strategy (dofactory.com) Визначає сімейство алгоритмів, в якому інкапсулюється кожен з них
їх взаємозаміна. Патерн "Стратегія" дозволяє змінювати алгоритми сімейства незалежно від клієнтів, які використовують ці алгоритми.

Слайд 41

Patterns

Strategy (dofactory.com)

class ConcreteStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(

Patterns Strategy (dofactory.com) class ConcreteStrategyB : Strategy { public override void AlgorithmInterface()
"CalledConcreteStrategyB.”+ ”AlgorithmInterface()");
}
}
class Context
{
private Strategy _strategy;
// Constructor
public Context(Strategy strategy)
{
this._strategy = strategy;
}
public void ContextInterface()
{
_strategy.AlgorithmInterface();
}
}

class MainApp
{
static void Main()
{
Context context;
context = new Context( new ConcreteStrategyA());
context.ContextInterface();
context = new Context( new ConcreteStrategyB());
context.ContextInterface();
}
}
/// The 'Strategy' abstract class
abstract class Strategy
{
public abstract void AlgorithmInterface();
}
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine(
"CalledConcreteStrategyA.”+ ”AlgorithmInterface()");
}
}

Слайд 42

Patterns

Bridge

Відокремлює абстракцію від реалізації, завдяки чому з'являється можливість незалежно змінювати те й

Patterns Bridge Відокремлює абстракцію від реалізації, завдяки чому з'являється можливість незалежно змінювати
інше

кнопка (однопозиційний перемикач) ел. мережі;
тумблер (двохпозиційний перемикач) ел. мережі;
перемикач із ДУ;
голосовий перемикач;
. . .

Слайд 43

Patterns

Bridge

Відокремлює абстракцію від реалізації, завдяки чому з'являється можливість незалежно змінювати те й

Patterns Bridge Відокремлює абстракцію від реалізації, завдяки чому з'являється можливість незалежно змінювати
інше.
Відомий також під іменем Handle/Body (описувач/тіло).

Шаллоуей А., Тротт Дж. Шаблоны проектирования. — ИД “Вильямс”, 2002.

Два різних середовища:
X Window System;
Presentation Manager (PM) від компанії IBM.

Слайд 44

Patterns

Bridge

Patterns Bridge

Слайд 45

Patterns

Bridge (GoF)

Patterns Bridge (GoF)

Слайд 46

Patterns

Bridge (data & object factory™, dofactory.com)

Patterns Bridge (data & object factory™, dofactory.com)

Слайд 47

Patterns

Bridge. “Починати з тих шаблонів, що створюють контекст для інших” (К.Александер).

Patterns Bridge. “Починати з тих шаблонів, що створюють контекст для інших” (К.Александер).

Слайд 48

Patterns

Façade (data & object factory™, dofactory.com)

Patterns Façade (data & object factory™, dofactory.com)

Слайд 49

Patterns

Observer (Спостерігач)

Визначає між об'єктами відношення типу один (видавець) - до - багатьох

Patterns Observer (Спостерігач) Визначає між об'єктами відношення типу один (видавець) - до
(передплатників), так що при зміні стану одного об'єкта (видавця) всі підлеглі (передплатники) одержують повідомлення й автоматично оновлюють дані.
Відомий також під іменами Dependents (підлеглі), Publish-Subscribe (видавець- передплатник).

Subject (суб'єкт):
надає інтерфейс для приєднання та від’єднання спостерігачів;
має інформацію про приєднаних спостерігачів (для їх оповіщення); за суб'єктом можуть “стежити ” скільки завгодно спостерігачів.
Observer (спостерігач):
надає інтерфейс для фіксації змін (операція Update).
ConcreteSubject (конкретний суб'єкт):
має стан, що становить інтерес для ConcreteObserver;
надає інтерфейс для “читання” та зміни стану (GetState, SetState).
ConcreteObserver (конкретний спостерігач):
зберігає посилання на об'єкт класу ConcreteSubject;
зберігає дані про стан, які повинні бути узгоджені із станом суб'єкта.

Слайд 50

Patterns

Observer

Patterns Observer

Слайд 51

Patterns

Observer

Patterns Observer

Слайд 52

Patterns

Observer

Patterns Observer

Слайд 53

Patterns

Observer (data & object factory™, dofactory.com)

Patterns Observer (data & object factory™, dofactory.com)

Слайд 54

Patterns

Observer (data & object factory™, dofactory.com)

using System;
using System.Collections;
abstract class Subject // "Subject"

Patterns Observer (data & object factory™, dofactory.com) using System; using System.Collections; abstract

{ // Fields
private ArrayList observers = new ArrayList();
// Methods
public void Attach( Observer observer )
{ observers.Add( observer );
}
public void Detach( Observer observer )
{ observers.Remove( observer );
}
public void Notify()
{ foreach( Observer o in observers )
o.Update();
}
}
class ConcreteSubject : Subject
{ // Fields
private string subjectState;
// Properties
public string SubjectState
{ get{ return subjectState; }
set{ subjectState = value; }
}
}

abstract class Observer // "Observer"
{abstract public void Update();
}
class ConcreteObserver : Observer
{ private string name;
private string observerState;
private ConcreteSubject subject;
public ConcreteObserver( ConcreteSubject subject, string name ) // Constructor
{ this.subject = subject;
this.name = name;
}
override public void Update()
{ observerState = subject.SubjectState;
Console.WriteLine( "Observer {0}'s new state is {1}",
name, observerState );
}
public ConcreteSubject Subject
{ get { return subject; }
set { subject = value; }
}
}

/// Client test
public class Client
{
public static void Main( string[] args )
{
// Configure Observer // structure
ConcreteSubject s = new ConcreteSubject();
s.Attach(new ConcreteObserver( s, "X" ) );
s.Attach( new ConcreteObserver( s, "Y" ) );
s.Attach( new ConcreteObserver( s, "Z" ) );
// Change subject, notify // observers
s.SubjectState = "ABC";
s.Notify();
}
}

Слайд 55

Patterns

Додаток

Patterns Додаток

Слайд 56

Patterns

Borland Developer Studio 2006

Patterns Borland Developer Studio 2006

Слайд 57

Patterns

Borland Developer Studio 2006

Patterns Borland Developer Studio 2006

Слайд 58

Patterns

Borland Developer Studio 2006

Patterns Borland Developer Studio 2006
Имя файла: Патерны-проектирования-.pptx
Количество просмотров: 131
Количество скачиваний: 0