mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-22 03:46:03 +03:00
update content
This commit is contained in:
parent
4de805ec34
commit
cf68abae34
33
README.md
33
README.md
@ -16,6 +16,22 @@
|
||||
+ 这里就是以实际代码示例展示设计模式,通俗易懂
|
||||
+ 除了常见的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)
|
||||
@ -38,21 +54,6 @@
|
||||
+ [x] [装饰器模式(Decorator)](./structure/06_decorator)
|
||||
+ [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
|
||||
|
||||
+ [x] [发布订阅模式(Pub-Sub)](./gomore/01_messages)
|
||||
@ -77,6 +78,8 @@
|
||||
|
||||
[golang-design-pattern](https://github.com/senghoo/golang-design-pattern)
|
||||
|
||||
[design_pattern](http://c.biancheng.net/design_pattern)
|
||||
|
||||
|
||||
## 更多
|
||||
|
||||
|
@ -1,6 +1,11 @@
|
||||
# 送代器模式
|
||||
|
||||
送代器模式主要设计在于实现一组实现通用迭代行为的迭代接口,对外提供一致性的迭代访问机制,而不必关心内部的数据类型和结构,目的是对集合类或者类集合类数据提供一致性的访问方式.
|
||||
送代器模式主要设计在于将一类相关的对象集中管理起来,通过一组通用的行为的迭代接口,对外提供一致性的迭代访问机制,使外部不必关心内部的数据类型和结构组织形式,目的是对集合类或者类集合类数据提供一致性的访问方式.
|
||||
|
||||
迭代器模式在各种语言中都有很深入,很广泛的应用,迭代器模式就是,对这种模式的进一步应用。
|
||||
迭代器模式在各种语言中都有很深入,很广泛的应用,迭代器模式就是,对这种存在于语言中的基本模式的进一步应用。
|
||||
|
||||
|
||||
迭代器是一种管理数据的方式。
|
||||
|
||||
现实生活中的景区的地图指南就是一个很好的迭代器的例子,地图就是一个迭代器,不论是哪个景区,都能通过一张地图(或者说这个迭代器),让你明白当前景区的景点数,最佳参观顺序等,游客只需要按照迭代器的方式去访问景点即可。
|
||||
|
||||
|
@ -1,49 +1,53 @@
|
||||
package iterator
|
||||
|
||||
import "fmt"
|
||||
////////////////////////////////
|
||||
//使用景点例子
|
||||
|
||||
type Aggregate interface {
|
||||
Iterator() Iterator
|
||||
//ITouristMap 游客地图是一个迭代器Iterator,为用户提供当前景区中不同景点的统一访问能力
|
||||
type ITouristMap interface {
|
||||
FirstPot() //首个景点
|
||||
IsLastPot() bool //当前景点是否是最后一个
|
||||
Next() interface{} //下一个景点
|
||||
}
|
||||
|
||||
type Iterator interface {
|
||||
First()
|
||||
IsDone() bool
|
||||
Next() interface{}
|
||||
//IScenicArea 是一个针对景区的Aggregate聚合类型接口,返回一个迭代器接口
|
||||
//IScenicArea 返回一个游客访问接口
|
||||
type IScenicArea interface {
|
||||
Iterator() ITouristMap
|
||||
}
|
||||
|
||||
type Numbers struct {
|
||||
start, end int
|
||||
//ScenicArea 景区包含所有的景点
|
||||
type ScenicArea struct {
|
||||
count int //景点的数量
|
||||
pots []interface{} //景点列表,景区可能一直在开发新的景点,所以景区的数量可能一直在增长
|
||||
}
|
||||
|
||||
func NewNumbers(start, end int) *Numbers {
|
||||
return &Numbers{
|
||||
start: start,
|
||||
end: end,
|
||||
}
|
||||
}
|
||||
|
||||
func (n *Numbers) Iterator() Iterator {
|
||||
return &NumbersIterator{
|
||||
//Iterator 通过
|
||||
func (s *ScenicArea) Iterator() ITouristMap {
|
||||
return &ScenicAreaPotsMap{
|
||||
numbers: n,
|
||||
next: n.start,
|
||||
}
|
||||
}
|
||||
|
||||
type NumbersIterator struct {
|
||||
//ScenicAreaPotsMap 就是景区提供的迭代器类型,要实现具体的景区景点的迭代访问能力
|
||||
type ScenicAreaPotsMap struct {
|
||||
numbers *Numbers
|
||||
next int
|
||||
}
|
||||
|
||||
func (i *NumbersIterator) First() {
|
||||
//FirstPot 第一个景点
|
||||
func (i *ScenicAreaPotsMap) FirstPot() {
|
||||
i.next = i.numbers.start
|
||||
}
|
||||
|
||||
func (i *NumbersIterator) IsDone() bool {
|
||||
//IsLastPot 是否是最后一个
|
||||
func (i *ScenicAreaPotsMap) IsLastPot() bool {
|
||||
return i.next > i.numbers.end
|
||||
}
|
||||
|
||||
func (i *NumbersIterator) Next() interface{} {
|
||||
//Next 去路线上的下一个景点
|
||||
func (i *ScenicAreaPotsMap) Next() interface{} {
|
||||
if !i.IsDone() {
|
||||
next := i.next
|
||||
i.next++
|
||||
@ -51,10 +55,3 @@ func (i *NumbersIterator) Next() interface{} {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func IteratorPrint(i Iterator) {
|
||||
for i.First(); !i.IsDone(); {
|
||||
c := i.Next()
|
||||
fmt.Printf("%#v\n", c)
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user