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