update content

This commit is contained in:
Edward 2020-05-03 02:53:02 +08:00
parent 4de805ec34
commit cf68abae34
3 changed files with 51 additions and 46 deletions

View File

@ -16,6 +16,22 @@
+ 这里就是以实际代码示例展示设计模式,通俗易懂 + 这里就是以实际代码示例展示设计模式,通俗易懂
+ 除了常见的23种普适的设计模式,Go也有一些属于自己的模式 + 除了常见的23种普适的设计模式,Go也有一些属于自己的模式
## 行为型模式
+ [x] [中介者模式(Mediator)](./behavior/01_mediator)
+ [x] [闭包选项模式(Function Option)](./behavior/02_option)
+ [x] [观察者模式(Observer)](./behavior/10_observer)
+ [ ] [命令模式(Command)](./behavior/11_command)
+ [ ] [迭代器模式(Iterator)](./behavior/04_iterator)
+ [ ] [模板方法模式(Template Method)](./behavior/14_template_method)
+ [x] [策略模式(Strategy)](./behavior/12_strategy)
+ [ ] [状态模式(State)](./behavior/behavior16_state)
+ [ ] [备忘录模式(Memento)](./behavior/17_memento)
+ [ ] [解释器模式(Interpreter)](./behavior/19_interpreter)
+ [ ] [职责链模式(Chain of Responsibility)](./behavior/21_chain_of_responsibility)
+ [ ] [访问者模式(Visitor)](./behavior/23_visitor)
## 创建型模式 ## 创建型模式
+ [x] [New模式(New)](./creation/01_new) + [x] [New模式(New)](./creation/01_new)
@ -38,21 +54,6 @@
+ [x] [装饰器模式(Decorator)](./structure/06_decorator) + [x] [装饰器模式(Decorator)](./structure/06_decorator)
+ [x] [代理模式(Proxy)](./structure/07_proxy) + [x] [代理模式(Proxy)](./structure/07_proxy)
## 行为型模式
+ [x] [中介者模式(Mediator)](./behavior/08_mediator)
+ [x] [观察者模式(Observer)](./behavior/10_observer)
+ [ ] [命令模式(Command)](./behavior/11_command)
+ [ ] [迭代器模式(Iterator)](./behavior/04_iterator)
+ [ ] [模板方法模式(Template Method)](./behavior/14_template_method)
+ [x] [策略模式(Strategy)](./behavior/12_strategy)
+ [ ] [状态模式(State)](./behavior/behavior16_state)
+ [ ] [备忘录模式(Memento)](./behavior/17_memento)
+ [ ] [解释器模式(Interpreter)](./behavior/19_interpreter)
+ [ ] [职责链模式(Chain of Responsibility)](./behavior/21_chain_of_responsibility)
+ [ ] [访问者模式(Visitor)](./behavior/23_visitor)
+ [x] [闭包选项模式(Function Option)](./behavior/26_option)
## Go More ## Go More
+ [x] [发布订阅模式(Pub-Sub)](./gomore/01_messages) + [x] [发布订阅模式(Pub-Sub)](./gomore/01_messages)
@ -77,6 +78,8 @@
[golang-design-pattern](https://github.com/senghoo/golang-design-pattern) [golang-design-pattern](https://github.com/senghoo/golang-design-pattern)
[design_pattern](http://c.biancheng.net/design_pattern)
## 更多 ## 更多

View File

@ -1,6 +1,11 @@
# 送代器模式 # 送代器模式
送代器模式主要设计在于实现一组实现通用迭代行为的迭代接口,对外提供一致性的迭代访问机制,而不必关心内部的数据类型和结构,目的是对集合类或者类集合类数据提供一致性的访问方式. 送代器模式主要设计在于将一类相关的对象集中管理起来,通过一组通用的行为的迭代接口,对外提供一致性的迭代访问机制,使外部不必关心内部的数据类型和结构组织形式,目的是对集合类或者类集合类数据提供一致性的访问方式.
迭代器模式在各种语言中都有很深入,很广泛的应用,迭代器模式就是,对这种模式的进一步应用。 迭代器模式在各种语言中都有很深入,很广泛的应用,迭代器模式就是,对这种存在于语言中的基本模式的进一步应用。
迭代器是一种管理数据的方式。
现实生活中的景区的地图指南就是一个很好的迭代器的例子,地图就是一个迭代器,不论是哪个景区,都能通过一张地图(或者说这个迭代器),让你明白当前景区的景点数,最佳参观顺序等,游客只需要按照迭代器的方式去访问景点即可。

View File

@ -1,49 +1,53 @@
package iterator package iterator
import "fmt" ////////////////////////////////
//使用景点例子
type Aggregate interface { //ITouristMap 游客地图是一个迭代器Iterator为用户提供当前景区中不同景点的统一访问能力
Iterator() Iterator type ITouristMap interface {
FirstPot() //首个景点
IsLastPot() bool //当前景点是否是最后一个
Next() interface{} //下一个景点
} }
type Iterator interface { //IScenicArea 是一个针对景区的Aggregate聚合类型接口返回一个迭代器接口
First() //IScenicArea 返回一个游客访问接口
IsDone() bool type IScenicArea interface {
Next() interface{} Iterator() ITouristMap
} }
type Numbers struct { //ScenicArea 景区包含所有的景点
start, end int type ScenicArea struct {
count int //景点的数量
pots []interface{} //景点列表,景区可能一直在开发新的景点,所以景区的数量可能一直在增长
} }
func NewNumbers(start, end int) *Numbers { //Iterator 通过
return &Numbers{ func (s *ScenicArea) Iterator() ITouristMap {
start: start, return &ScenicAreaPotsMap{
end: end,
}
}
func (n *Numbers) Iterator() Iterator {
return &NumbersIterator{
numbers: n, numbers: n,
next: n.start, next: n.start,
} }
} }
type NumbersIterator struct { //ScenicAreaPotsMap 就是景区提供的迭代器类型,要实现具体的景区景点的迭代访问能力
type ScenicAreaPotsMap struct {
numbers *Numbers numbers *Numbers
next int next int
} }
func (i *NumbersIterator) First() { //FirstPot 第一个景点
func (i *ScenicAreaPotsMap) FirstPot() {
i.next = i.numbers.start i.next = i.numbers.start
} }
func (i *NumbersIterator) IsDone() bool { //IsLastPot 是否是最后一个
func (i *ScenicAreaPotsMap) IsLastPot() bool {
return i.next > i.numbers.end return i.next > i.numbers.end
} }
func (i *NumbersIterator) Next() interface{} { //Next 去路线上的下一个景点
func (i *ScenicAreaPotsMap) Next() interface{} {
if !i.IsDone() { if !i.IsDone() {
next := i.next next := i.next
i.next++ i.next++
@ -51,10 +55,3 @@ func (i *NumbersIterator) Next() interface{} {
} }
return nil return nil
} }
func IteratorPrint(i Iterator) {
for i.First(); !i.IsDone(); {
c := i.Next()
fmt.Printf("%#v\n", c)
}
}