Skip to content

Commit a6793b2

Browse files
committed
Update patterns
1 parent 511082b commit a6793b2

5 files changed

Lines changed: 65 additions & 33 deletions

File tree

Behavioral/Iterator/README.md

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55

66
Паттерн Iterator предоставляет механизм обхода коллекций объектов не раскрывая их внутреннего представления.
77

8-
Зачастую этот паттерн используется вместо массива объектов, чтобы не только предоставить доступ к элементам, но и наделить некоторой логикой.
8+
Зачастую этот паттерн используется вместо массива объектов, чтобы не только предоставить доступ к элементам, но и наделить некоторой логикой.
99

10-
Iterator представляет собой общий интерфейс, позволяющий реализовать произвольную логику итераций. Обычно итераторы имеют набор следующих методов:
11-
12-
Метод Current() возвращает текущий элемент коллекции;
13-
Метод Next() перемещает указатель на следующий элемент коллекции и возвращает его;
14-
Метод HasNext() проверяет доступность следующего элемента.
10+
Iterator представляет собой общий интерфейс, позволяющий реализовать произвольную логику итераций.
1511

1612
Требуется для реализации:
1713

@@ -22,4 +18,4 @@ Iterator представляет собой общий интерфейс, по
2218

2319
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
2420

25-
## -~- THE END -~-
21+
## -~- THE END -~-

Behavioral/Iterator/iterator.go

Lines changed: 49 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ package iterator
55

66
// Тип Iterator, описывает общий интерфейс для итераторов.
77
type Iterator interface {
8-
Next() interface{}
9-
HasNext() bool
8+
Index() int
9+
Value() interface{}
10+
Has() bool
11+
Next()
12+
Prev()
13+
Reset()
14+
End()
1015
}
1116

1217
// Тип Aggregate, описывает общий интерфейс для коллекций.
@@ -16,25 +21,57 @@ type Aggregate interface {
1621

1722
// Тип BookIterator (ConcreteIterator), реализует итератор по книжной полке
1823
type BookIterator struct {
19-
shelf *BookShelf
20-
current int
24+
shelf *BookShelf
25+
index int
26+
internal int
2127
}
2228

23-
// Возвращает следующий элемент
24-
func (self *BookIterator) Next() interface{} {
25-
book := self.shelf.Books[self.current]
26-
self.current++
27-
return book
29+
// Возвращает текущий индекс
30+
func (self *BookIterator) Index() int {
31+
return self.index
2832
}
2933

30-
// Проверяет доступность следующего элемента
31-
func (self *BookIterator) HasNext() bool {
32-
if self.current >= len(self.shelf.Books) {
34+
// Возвращает текущее значение
35+
func (self *BookIterator) Value() interface{} {
36+
return self.shelf.Books[self.index]
37+
}
38+
39+
// Проверет возможен ли переход к другому элементу
40+
func (self *BookIterator) Has() bool {
41+
if self.internal < 0 || self.internal >= len(self.shelf.Books) {
3342
return false
3443
}
3544
return true
3645
}
3746

47+
// Переходит к следующему элементу
48+
func (self *BookIterator) Next() {
49+
self.internal++
50+
if self.Has() {
51+
self.index++
52+
}
53+
}
54+
55+
// Переходит к предыдущему элементу
56+
func (self *BookIterator) Prev() {
57+
self.internal--
58+
if self.Has() {
59+
self.index--
60+
}
61+
}
62+
63+
// Сбрасывает итератор в начало
64+
func (self *BookIterator) Reset() {
65+
self.index = 0
66+
self.internal = 0
67+
}
68+
69+
// Прокручивает итератор в конец
70+
func (self *BookIterator) End() {
71+
self.index = len(self.shelf.Books) - 1
72+
self.internal = self.index
73+
}
74+
3875
// Тип BookShelf (ConcreteAggregate), реализует книжную полку (коллекцию элементов)
3976
type BookShelf struct {
4077
Books []*Book

Behavioral/Iterator/iterator_test.go

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@ func TestIterator(t *testing.T) {
1111
books := []string{"A", "B", "C", "D", "E", "F"}
1212

1313
for _, book := range books {
14-
shelf.Add(&Book{Name:book})
14+
shelf.Add(&Book{Name: book})
1515
}
1616

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)
17+
for iterator := shelf.Iterator(); iterator.Has(); iterator.Next() {
18+
index, value := iterator.Index(), iterator.Value().(*Book)
19+
if value.Name != books[index] {
20+
t.Errorf("Expect Book.Name to %s, but %s", books[index], value.Name)
2121
}
22-
i++
2322
}
24-
}
23+
}

Behavioral/TemplateMethod/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@
1414

1515
[!] В описании паттерна применяются общие понятия, такие как Класс, Объект, Абстрактный класс. Применимо к языку Go, это Пользовательский Тип, Значение этого Типа и Интерфейс. Также в языке Go за место общепринятого наследования используется агрегирование и встраивание.
1616

17-
Т.к. в Go нет понятия "Абстрактный Класс" следует использовать встравивания общего для ConcreteClass типа с реализацией Template Method.
17+
Т.к. в Go нет понятия "Абстрактный Класс" и знакомого нам полиморфизма на наследовании, следует использовать встравивания общего для ConcreteClass типа с реализацией Template Method.
1818

19-
## -~- THE END -~-
19+
## -~- THE END -~-

Behavioral/TemplateMethod/template_method.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Паттерн Шаблонный метод (Template Method)
22
//
3-
// На самом деле этот шаблон основывается на Абстрактном Классе и Наследовании.
4-
// Но т.к. ничего этого в Go нет, будет применено агрегирование.
3+
// На самом деле этот шаблон основывается на Абстрактном Классе и Полиморфизме.
4+
// Но т.к. ничего этого в Go нет, будет применено встраивание.
55
// Хотя по правилам, это паттерн уровня класса.
66

77
package template_method
@@ -14,15 +14,15 @@ type QuotesInterface interface {
1414

1515
// Тип Quotes, рeализует Template Method
1616
type Quotes struct {
17-
qt QuotesInterface
17+
QuotesInterface
1818
}
1919

2020
// Template Method
2121
func (self *Quotes) Quotes(str string) string {
22-
return self.qt.Open() + str + self.qt.Close()
22+
return self.Open() + str + self.Close()
2323
}
2424

25-
// Установка закрывающей кавычки
25+
// Конструктор
2626
func NewQuotes(qt QuotesInterface) *Quotes {
2727
return &Quotes{qt}
2828
}

0 commit comments

Comments
 (0)