Skip to content

Commit 0605a1f

Browse files
committed
Public
1 parent 3192f6b commit 0605a1f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

73 files changed

+2402
-15
lines changed

.gitattributes

-15
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,2 @@
11
# Auto detect text files and perform LF normalization
22
* text=auto
3-
4-
# Custom for Visual Studio
5-
*.cs diff=csharp
6-
7-
# Standard to msysgit
8-
*.doc diff=astextplain
9-
*.DOC diff=astextplain
10-
*.docx diff=astextplain
11-
*.DOCX diff=astextplain
12-
*.dot diff=astextplain
13-
*.DOT diff=astextplain
14-
*.pdf diff=astextplain
15-
*.PDF diff=astextplain
16-
*.rtf diff=astextplain
17-
*.RTF diff=astextplain

.gitignore

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Build results
2+
bin/
3+
pkg/
4+
5+
#Bat
6+
*.bat
7+
8+
# Log
9+
*.log
10+
11+
# Windows image file caches
12+
Thumbs.db
13+
14+
# Folder config file
15+
Desktop.ini
16+
17+
# Mac crap
18+
.DS_Store
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
2+
## Цепочка ответственности (Chain Of Responsibilities)
3+
4+
Паттерн Chain Of Responsibilities относится к поведенческим паттернам уровня объекта.
5+
6+
Паттерн Chain Of Responsibilities позволяет избежать привязки объекта-отправителя запроса к объекту-получателю запроса, при этом давая шанс обработать этот запрос нескольким объектам. Получатели связываются в цепочку, и запрос передается по цепочке, пока не будет обработан каким-то объектом.
7+
8+
По сути это цепочка обработчиков, которые по очереди получают запрос, а затем решают, обрабатывать его или нет. Если запрос не обработан, то он передается дальше по цепочке. Если же он обработан, то паттерн сам решает передавать его дальше или нет. Если запрос не обработан ни одним обработчиком, то он просто теряется.
9+
10+
Требуется для реализации:
11+
12+
1. Базовый абстрактный класс Handler, описывающий интерфейс обработчиков в цепочки;
13+
2. Класс ConcreteHandlerA, реализующий конкретный обработчик A;
14+
3. Класс ConcreteHandlerB, реализующий конкретный обработчик B;
15+
4. Класс ConcreteHandlerC, реализующий конкретный обработчик C;
16+
17+
Обратите внимание, что вместо хранения ссылок на всех кандидатов-получателей запроса, каждый отправитель хранит единственную ссылку на начало цепочки, а каждый получатель имеет единственную ссылку на своего преемника - последующий элемент в цепочке.
18+
19+
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Экземпляр этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
20+
21+
## -~- THE END -~-
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Паттерн Цепочка ответственности (Chain Of Responsibilities)
2+
//
3+
4+
package chain_of_responsibilities
5+
6+
// Тип Handler, описывает интерфейс обработчиков в цепочки
7+
type Handler interface {
8+
SendRequest(message int) string
9+
}
10+
11+
// Тип ConcreteHandlerA, реализует обработчик "A"
12+
type ConcreteHandlerA struct {
13+
next Handler
14+
}
15+
16+
func (self *ConcreteHandlerA) SendRequest(message int) (result string) {
17+
if message == 1 {
18+
result = "Im handler 1"
19+
} else if self.next != nil {
20+
result = self.next.SendRequest(message)
21+
}
22+
return
23+
}
24+
25+
// Тип ConcreteHandlerB, реализует обработчик "B"
26+
type ConcreteHandlerB struct {
27+
next Handler
28+
}
29+
30+
func (self *ConcreteHandlerB) SendRequest(message int) (result string) {
31+
if message == 2 {
32+
result = "Im handler 2"
33+
} else if self.next != nil {
34+
result = self.next.SendRequest(message)
35+
}
36+
return
37+
}
38+
39+
// Тип ConcreteHandlerC, реализует обработчик "C"
40+
type ConcreteHandlerC struct {
41+
next Handler
42+
}
43+
44+
func (self *ConcreteHandlerC) SendRequest(message int) (result string) {
45+
if message == 3 {
46+
result = "Im handler 3"
47+
} else if self.next != nil {
48+
result = self.next.SendRequest(message)
49+
}
50+
return
51+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package chain_of_responsibilities
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestChainOfResponsibilities(t *testing.T) {
8+
9+
expect := "Im handler 2"
10+
11+
handlers := &ConcreteHandlerA{
12+
next:&ConcreteHandlerB{
13+
next:&ConcreteHandlerC{},
14+
},
15+
}
16+
17+
result := handlers.SendRequest(2)
18+
19+
if result != expect {
20+
t.Errorf("Expect result to equal %s, but %s.\n", expect, result)
21+
}
22+
}

Behavioral/Command/README.md

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
## Команда (Command)
3+
4+
Паттерн Command относится к поведенческим паттернам уровня объекта.
5+
6+
Паттерн Command позволяет представить запрос в виде объекта. Из этого следует, что команда - это объект. Такие запросы, например, можно ставить в очередь, отменять или возобновлять.
7+
8+
В этом паттерне мы оперируем следующими понятиями:
9+
Command - запрос в виде объекта на выполнение;
10+
Receiver - объект-получатель запроса, который будет обрабатывать нашу команду;
11+
Invoker - объект-инициатор запроса.
12+
13+
Паттерн Command отделяет объект, инициирующий операцию, от объекта, который знает, как ее выполнить. Единственное, что должен знать инициатор, это как отправить команду.
14+
15+
Требуется для реализации:
16+
17+
1. Базовый абстрактный класс Command описывающий интерфейс команды;
18+
2. Класс ConcreteCommand, реализующий команду;
19+
3. Класс Invoker, реализующий инициатора, записывающий команду и провоцирующий её выполнение;
20+
4. Класс Receiver, реализующий получателя и имеющий набор действий, которые команда можем запрашивать;
21+
22+
Invoker умеет складывать команды в стопку и инициировать их выполнение по какому-то событию. Обратившись к Invoker можно отменить команду, пока та не выполнена.
23+
24+
ConcreteCommand содержит в себе запросы к Receiver, которые тот должен выполнять. В свою очередь Receiver содержит только набор действий (Actions), которые выполняются при обращении к ним из ConcreteCommand.
25+
26+
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Экземпляр этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
27+
28+
## -~- THE END -~-

Behavioral/Command/command.go

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Паттерн Команда (Command)
2+
//
3+
4+
package command
5+
6+
// Тип Command, описывает общий интерфейс для команд
7+
type Command interface {
8+
Execute() string
9+
}
10+
11+
// Тип ToggleOnCommand, реализует команду включения тумблера
12+
type ToggleOnCommand struct {
13+
receiver *Receiver
14+
}
15+
16+
// Выполнение команды получателем
17+
func (self *ToggleOnCommand) Execute() string {
18+
return self.receiver.ToggleOn()
19+
}
20+
21+
// Тип ToggleOffCommand, реализует команду выключения тумблера
22+
type ToggleOffCommand struct {
23+
receiver *Receiver
24+
}
25+
26+
// Выполнение команды получателем
27+
func (self *ToggleOffCommand) Execute() string {
28+
return self.receiver.ToggleOff()
29+
}
30+
31+
// Тип Receiver, реализует получателя команд
32+
// Реализует набор действие которые получатель должен
33+
// выполнять, взависимости от полученой команды
34+
type Receiver struct {
35+
}
36+
37+
// Действие на команду "поднять тумблер (ToggleOnCommand)"
38+
func (self *Receiver) ToggleOn() string {
39+
return "Toggle On"
40+
}
41+
42+
// Действие на команду "опустить тумблер (ToggleOffCommand)"
43+
func (self *Receiver) ToggleOff() string {
44+
return "Toggle Off"
45+
}
46+
47+
// Тип Invoker, реализует инициатора команды
48+
type Invoker struct {
49+
commands []Command
50+
}
51+
52+
func (self *Invoker) StoreCommand(command Command) {
53+
self.commands = append(self.commands, command)
54+
}
55+
56+
func (self *MacroCommand) UnStoreCommand() {
57+
if len(self.commands) != 0 {
58+
self.commands = self.commands[:len(self.commands)-1]
59+
}
60+
}
61+
62+
func (self *Invoker) Execute() string {
63+
var result string
64+
for _, command := range self.commands {
65+
result += command.Execute() + "\n"
66+
}
67+
return result
68+
}

Behavioral/Command/command_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package command
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestCommand(t *testing.T) {
8+
9+
expect := "Toggle On\n" +
10+
"Toggle Off\n"
11+
12+
invoker := &Invoker{}
13+
receiver := &Receiver{}
14+
15+
invoker.StoreCommand(&ToggleOnCommand{receiver:receiver})
16+
invoker.StoreCommand(&ToggleOffCommand{receiver:receiver})
17+
18+
19+
result := invoker.Execute()
20+
21+
if result != expect {
22+
t.Errorf("Expect result to equal %s, but %s.\n", expect, result)
23+
}
24+
}

Behavioral/Iterator/README.md

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
## Итератор (Iterator)
3+
4+
Паттерн Iterator относится к поведенческим паттернам уровня объекта.
5+
6+
Паттерн Iterator предоставляет механизм обхода коллекций объектов не раскрывая их внутреннего представления.
7+
8+
Зачастую этот паттерн используется вместо массива объектов, чтобы не только предоставить доступ к элементам, но и наделить некоторой логикой.
9+
10+
Iterator представляет собой общий интерфейс, позволяющий реализовать произвольную логику итераций. Обычно итераторы имеют набор следующих методов:
11+
12+
Метод Current() возвращает текущий элемент коллекции;
13+
Метод Next() перемещает указатель на следующий элемент коллекции и возвращает его;
14+
Метод HasNext() проверяет доступность следующего элемента.
15+
16+
Требуется для реализации:
17+
18+
1. Интерфейс Iterator описывающий набор методов для доступа к коллекции;
19+
2. Класс ConcreteIterator, реализующий интерфейс Iterator. Следит за позицией текущего элемента при переборе коллекции (Aggregate).;
20+
3. Интерфейс Aggregate описывающий набор методов коллекции объектов;
21+
4. Класс ConcreteAggregate, реализующий интерфейс Aggregate и хранящий в себе элементы коллекции.
22+
23+
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Экземпляр этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
24+
25+
## -~- THE END -~-

Behavioral/Iterator/iterator.go

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Паттерн Итератор (Iterator)
2+
//
3+
4+
package iterator
5+
6+
// Тип Iterator, описывает общий интерфейс для итераторов.
7+
type Iterator interface {
8+
Next() interface{}
9+
HasNext() bool
10+
}
11+
12+
// Тип Aggregate, описывает общий интерфейс для коллекций.
13+
type Aggregate interface {
14+
Iterator() Iterator
15+
}
16+
17+
// Тип BookIterator (ConcreteIterator), реализует итератор по книжной полке
18+
type BookIterator struct {
19+
shelf *BookShelf
20+
current int
21+
}
22+
23+
// Возвращает следующий элемент
24+
func (self *BookIterator) Next() interface{} {
25+
book := self.shelf.Books[self.current]
26+
self.current++
27+
return book
28+
}
29+
30+
// Проверяет доступность следующего элемента
31+
func (self *BookIterator) HasNext() bool {
32+
if self.current >= len(self.shelf.Books) {
33+
return false
34+
}
35+
return true
36+
}
37+
38+
// Тип BookShelf (ConcreteAggregate), реализует книжную полку (коллекцию элементов)
39+
type BookShelf struct {
40+
Books []*Book
41+
}
42+
43+
// Создает и возвращает итератор по коллекции
44+
func (self *BookShelf) Iterator() Iterator {
45+
return &BookIterator{shelf: self}
46+
}
47+
48+
// Добавляет элемент в коллекции
49+
func (self *BookShelf) Add(book *Book) {
50+
self.Books = append(self.Books, book)
51+
}
52+
53+
// Тип Book, реализует элемент коллекции
54+
type Book struct {
55+
name string
56+
}

Behavioral/Iterator/iterator_test.go

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package iterator
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestIterator(t *testing.T) {
8+
9+
shelf := &BookShelf{}
10+
11+
books := []string{"A", "B", "C", "D", "E", "F"}
12+
13+
for _, book := range books {
14+
shelf.Add(&Book{name:book})
15+
}
16+
17+
i := 0
18+
for iterator := shelf.Iterator(); iterator.HasNext(); {
19+
if elm := iterator.Next(); elm.(*Book).name != books[i] {
20+
t.Errorf("Expect Book.name to %s, but %s", books[i], elm.(*Book).name)
21+
}
22+
i++
23+
}
24+
}

Behavioral/Mediator/README.md

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
2+
## Посредник (Mediator)
3+
4+
Паттерн Mediator относится к поведенческим паттернам уровня объекта.
5+
6+
Паттерн Mediator предоставляет объект-посредник, скрывающий способ взаимодействия множества других объектов-коллег. Mediator делает систему слабо связанной, избавляя объекты от необходимости ссылаться друг на друга, что позволяет изменять взаимодействие между ними независимо.
7+
8+
Например, у нас есть посредник между заводом производства хлебобулочных изделий, фермером и магазином сбыта. Посредник избавляет фермера от взаимодействия с заводом, который использует его сырье, а завод от взаимодействия с магазином, в который поступает продукция для сбыта.
9+
10+
Требуется для реализации:
11+
12+
1. Интерфейс Mediator - посредник описывающий организацию процесса по обмену информацией между объектами типа Colleague;
13+
2. Класс ConcreteMediator, реализующий интерфейс Mediator;
14+
3. Базовый абстрактный класс Colleague - коллега описывающий организацию процесса взаимодействия объектов-коллег с объектом типа Mediator;
15+
4. Класс ConcreteColleague, реализующий интерфейс Colleague. Каждый объект-коллега знает только об объекте-медиаторе. Все объекты-коллеги обмениваются информацией только через посредника.
16+
17+
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Экземпляр этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
18+
19+
## -~- THE END -~-

0 commit comments

Comments
 (0)