355.39K
Категория: ПрограммированиеПрограммирование

Паттерны Gof

1.

Паттерны Gof

2.

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

3.

Фабричный метод (Factory Method)
Document documents
Open()
DrawingDocument
Open()
Application
CreateDocument() : Document
NewDocument()
DrawingApplication
CreateDocument() : Document
public void NewDocument()
{
Document doc = CreateDocument();
documents.Add(doc);
doc.Open();
}
public override Document CreateDocument()
{
return new DrawingDocument();
}

4.

Фабричный метод (Factory Method)
Product
ConcreteProduct
Creator
CreateProduct() : Product
ConcreteCreator
CreateProduct() : Product
public override Product CreateProduct()
{
return new ConcreteProduct();
}

5.

Абстрактная фабрика (Abstract Factory)
Client
public override Window CreateWindow()
{
return new RectWindow();
}
ControlsFactory
CreateWindow() : Window
CreateButton() : Button
Window
RectWindow
RectControlsFactory
CreateWindow() : Window
CreateButton() : Button
public override Button CreateButton()
{
return new RectButton();
}
RoundControlsFactory
CreateWindow() : Window
CreateButton() : Button
public override Button CreateButton()
{
return new RoundButton();
}
RoundWindow
Button
RectButton
public override Window CreateWindow()
{
return new RoundWindow();
}
RoundButton

6.

Абстрактная фабрика (Abstract Factory)
Client
public override ProductA CreateProductA()
{
return new ProductA1();
}
AbstractFactory
CreateProductA() : ProductA
CreateProductB() : ProductB
ConcreteFactory1
CreateProductA() : ProductA
CreateProductB() : ProductB
public override ProductB CreateProductB()
{
return new ProductB1();
}
ConcreteFactory2
CreateProductA() : ProductA
CreateProductB() : ProductB
AbstractProductA
ProductA1
ProductA2
public override ProductA CreateProductA()
{
return new ProductA2();
}
public override ProductB CreateProductB()
{
return new ProductB2();
}
AbstractProductB
ProductB1
ProductB2

7.

Одиночка (Singleton)
Singleton
UniqueInstance : Singleton
Instance() : Singleton
return UniqueInstance;

8.

Строитель (Builder)
Converter
RTFReader
Convert(converter : Converter)
public void Convert(Converter converter)
{
...
converter.ConvertCharacter(x);
...
converter.FontChange(font);
...
converter.ConvertParagraph();
...
}
ConvertCharacter(c : char)
ConvertFontChange(f : Font)
ConvertParagraph()
ASCIIConverter
ConvertCharacter(c : char)
GetASCIIText() : ASCIIText
LaTeXConverter
ConvertCharacter(c : char)
ConvertFontChange(f : Font)
ConvertParagraph()
GetLaTeXText() : LaTeXText
ASCIIText
LaTeXText

9.

Строитель (Builder)
Director
Construct()
Builder
BuildPart(...)
ConcreteBuilder
BuildPart(...)
GetProduct() : Product
Product

10.

Строитель (Builder)
:Clent
create()
builder: ConcreteBuilder
product: Product
create(builder)
:Director
Construct()
BuildPartA(...)
BuildPartB(...)
BuildPartC(...)
GetProduct()
product

11.

Прототип (Prototype)
Client
создает новые объекты
следующим образом:
newprototype = prototype.Clone();
prototype
Prototype
Clone() : Prototype
ConcretePrototype1
Clone() : Prototype
создает и возвращает
копию самого себя
ConcretePrototype2
Clone() : Prototype
создает и возвращает
копию самого себя

12.

Компоновщик (Composite)
Graphic
Операции AddItem,
RemoveItem, GetItem - пустые
Line
Draw()
Draw()
AddItem(item : Graphic)
RemoveItem(item : Graphic)
GetItem(index : integer) : Graphic
Rectangle
Draw()
Text
Draw()
public override void Draw()
{
foreach (Graphic item in items)
item.Draw();
}
items
Picture
Draw()
AddItem(item : Graphic)
RemoveItem(item : Graphic)
GetItem(index : integer) : Graphic
public override void Add(Graphic item)
{
items.Add(item);
}
аналогично реализованы RemoveItem
и GetItem

13.

Компоновщик (Composite)
Component
Client
Operation()
AddItem(item : Component)
RemoveItem(item : Component)
GetItem(index : integer) : Component
Leaf
Operation()
items
Composite
Operation()
AddItem(item : Component)
RemoveItem(item : Component)
GetItem(index : integer) : Component

14.

Компоновщик (Composite)
Component
Client
Operation()
AddItem(item : Component)
RemoveItem(item : Component)
GetItem(index : integer) : Component
Leaf
Operation()
items
Composite
Operation()
AddItem(item : Component)
RemoveItem(item : Component)
GetItem(index : integer) : Component
:Line
:Picture
:Text
:Line
:Picture
:Rectangle

15.

Декоратор (Decorator)
component
VisualComponent
Draw()
TextView
Draw()
:Client
Decorator
public override void Draw()
{
component.Draw();
}
Draw()
ScrollDecorator
ScrollPosition
BorderDecorator
BorderStyle
Draw()
ScrollToPosition()
Draw()
DrawBorder()
:BorderDecorator
public override void Draw()
{
base.Draw();
DrawBorder();
}
:ScrollBorder
:TextView

16.

Декоратор (Decorator)
Component
Operation()
ConcreteComponent
Operation()
ConcreteDecorator1
AdditionalState
Operation()
component
Decorator
Operation()
public override void Operation()
{
component.Operation();
}
ConcreteDecorator2
Operation()
AdditionalBehavior()
public override void Operation()
{
base.Operation();
AdditionalBehavior();
}

17.

Мост (Bridge)
Client
public void Operation()
{
imp.OperationImp();
}
Abstraction
Operation()
RefinedAbstraction
imp
Implementor
OperationImp()
ConcreteImplementor1
OperationImp()
ConcreteImplementor2
OperationImp()

18.

Фасад (Facade)
классы клиента
Фасад
классы подсистемы

19.

Фасад (Facade)
Client
Compiler
Compile()
Stream
Scanner
ByteCodeStream
CodeGenerator
ProgramNodeNuilder
Parser
ProgramNode
StatementNode
ExpressionNode

20.

Фасад (Facade)
Client1
Client2
Facade
Классы подсистемы
Class1
Class4
Class3
Class2
Class5

21.

Адаптер (Adapter)
Client
<<interface>>
Target
Request()
Adaptee
SpecificRequest()
Adapter
Request()
Client
<<interface>>
Target
Request()
public override void Request()
{
this.SpecificRequest();
}
Adaptee
SpecificRequest()
adaptee
Adapter
Request()
public override void Request()
{
adaptee.SpecificRequest();
}

22.

Приспособленец (Flyweight)
FlyweightFactory
GetFlyweight(key) : Flyweight
flyweights
Flyweight
Operation(extrinsicState)
ConcreteFlyweight
intrinsicState
Client
Operation(extrinsicState)
public Flyweight GetFlyweight(key)
{
if (flyweights[key] существует)
return flyweights[key];
else
{
создать новый flyweight по key;
flyweights.Add(flyweight);
return flyweight;
}
}
UnsharedConcreteFlyweight
allState
Operation(extrinsicState)

23.

Заместитель (Proxy)
subject
Client
public override void Request()
{
...
realSubject.Request();
...
}
:Client
subject
Proxy
Request()
:Proxy
Subject
Request()
realSubject
realSubject
RealSubject
Request()
:RealSubject

24.

Шаблонный метод (Template Method)
class Application
{
...
Public void OpenDocument()
{
if (CanOpenDocument())
{
string filename = SelectFileName();
if (FileExists(filename))
{
Document doc = LoadDocument(filename);
documents.Add(doc);
}
}
}

25.

Шаблонный метод (Template Method)
Application
OpenDocument()
CanOpenDocument() : boolean
SelectFileName() : string
FileExists(filename : string) : boolean
LoadDocument(filename : string) : Document
DrawingApplication
CanOpenDocument() : boolean
SelectFileName() : string
FileExists(filename : string) : boolean
LoadDocument(filename : string) : Document
Document
DrawingDocument
public override Document LoadDocument(string filename)
{
...
DrawingDocument doc = new DrawingDocument();
...
return doc;
}

26.

Шаблонный метод (Template Method)
AbstractClass
TemplateMethod()
PrimitiveOperation1()
PrimitiveOperation2()
ConcreteClass
PrimitiveOperation1()
PrimitiveOperation2()
public void TemplateMethod()
{
...
PrimitiveOperation1();
...
PrimitiveOperation2();
...
}

27.

Посредник (Mediator)
:Список
:ПолеВводаТекста
1
1
1
распорядитель
1
распорядитель
:МенеджерНастроек
распорядитель
1
1
распорядитель
1
:ПереключательСтиля
1
:Образец

28.

Посредник (Mediator)
:МенеджерНастроек
:Список
:ПолеВводаТекста
:Образец
ИзменилсяСписок
ЧтоИзменилось
данные
текст = ИзвлечьТекст(данные)
ЗадатьТекст(текст)
эскиз = СформироватьЭскиз
ЗадатьИзображение(эскиз)

29.

Посредник (Mediator)
DialogDirector
director
Control
ShowDialog()
ControlChanged(control : Control)
Changed()
list
PreferencesDialogDirector
ControlChanged(control : Control)
ListBox
TextBox
textbox
public override void ControlChaged(Control control)
{
определяем, что изменилось,
и в соответствии с этим обращаемся к объектам;
}
public void Chaged()
{
director.ControlChanged(this);
}

30.

Посредник (Mediator)
mediator
Mediator
Colleague
ConcreteColleague1
ConcreteMediator
ConcreteColleague2
:ConcreteColleague1
:ConcreteColleague3
1
1
object1
1
mediator
1
object3
mediator
:ConcreteMediator
1
mediator
1
object2
:ConcreteColleague2
...

31.

Команда (Command)
Application
Add(doc : Document)
Document
Open()
Close()
Cut()
Copy()
Paste()
Menu
Add(item : MenuItem)
public void Clicked()
{
command.Execute();
}
MenuItem
Clicked()
command
Command
Execute()
ConcreteCommand1
Execute()
ConcreteCommand2
Execute()
Command
Execute()
Document
Open()
Close()
Cut()
Copy()
Paste()
document
PasteCommand
Execute()
public override void Execute()
{
document.Paste();
}

32.

Команда (Command)
command
Invoker
Receiver
Action()
receiver
Command
Execute()
ConcreteCommand
Execute()
public override void Execute()
{
receiver.Execute();
}

33.

Команда (Command)
макрокоманды
Command
Execute()
commands
MacroCommand
Execute()
public override void Execute()
{
foreach (Command c in commands)
c.Execute();
}

34.

Цепочка обязанностей (Chain Of Responsibility)
next
Client
Handler
HandleRequest()
ConcreteHandler1
HandleRequest()
:Client
:ConcreteHandler1
ConcreteHandler2
HandleRequest()
next
:ConcreteHandler2

35.

Итератор (Iterator)
Client
<<Interface>>
Iterator
First()
Next()
IsDone() : boolean
CurrentItem() : Item
<<Interface>>
Aggregate
CreateIterator() : Iterator
ConcreteIterator
First()
Next()
IsDone() : boolean
CurrentItem() : Item
ConcreteAggregate
CreateIterator() : Iterator
<<interface>>
Item
public override Iterator CreateIterator()
{
return new ConcreteIterator();
}

36.

Хранитель (Memento)
Memento
Originator
state : State
state
SaveState() : Memento
LoadState(m : Memento)
SetState(state : State)
GetState() : State
public Memento SaveState()
{
Memento m = new Memento();
m.SeteState(state);
return m;
}
public void LoadState(m: Memento)
{
state = m.GetState();
}

37.

Наблюдатель (Observer)
Subject
Attach(observer : Observer)
Detach(observer : Observer)
Notify()
public void Notify()
{
foreach (Observer o in observers)
o.Update();
}
ConcreteSubject
observers <<Interface>>
Observer
Update()
ConcreteObserver
Update()

38.

Посетитель (Visitor)
:ObjectStructure
public void Accept(Visitor visitor)
{
visitor.VisitConcreteElementA(this);
}
ConcreteElementA
Accept(visitor : Visitor)
Visitor
VisitConcreteElementA(a : ConcreteElementA)
VisitConcreteElementB(b : ConcreteElementB)
ConcreteVisitor1
VisitConcreteElementA(a : ConcreteElementA)
VisitConcreteElementB(b : ConcreteElementB)
Element
Accept(visitor : Visitor)
ObjectStructure
Client
ConcreteElementB
Accept(visitor : Visitor)
public void Accept(Visitor visitor)
{
visitor.VisitConcreteElementB(this);
}
ConcreteVisitor2
VisitConcreteElementA(a : ConcreteElementA)
VisitConcreteElementB(b : ConcreteElementB)
a: ConcreteElementA
b: ConcreteElementB
visitor: ConcreteVisitor
Accept(visitor)
VisitConcreteElementA(a)
OperationA()
AcceptVisitor(visitor)
VisitConcreteElementB(b)
OperationB()

39.

Состояние (State)
конфигурируется
текущ им состоянием
объекта Context
Client
Context
Request()
state.Handle();
state
ConcreteState1
Handle()
State
Handle()
ConcreteState2
Handle()

40.

Стратегия (Strategy)
Context
ContextInterface()
strategy
Strategy
AlgorithmInterface()
ConcreteStrategy1
AlgorithmInterface()
ConcreteStrategy2
AlgorithmInterface()
English     Русский Правила