finish interpreter patten

This commit is contained in:
Edward 2020-05-05 14:44:57 +08:00
parent b86d8c88e8
commit c988ffc8ff
5 changed files with 185 additions and 81 deletions

View File

@ -1,4 +1,4 @@
# Go语言设计模式示例集合(Go Patterns Examples) # Golang工程模式示例集合(Go Patterns Examples)
**包括了[go-patterns](https://github.com/tmrts/go-patterns) 和[golang-design-pattern](https://github.com/senghoo/golang-design-pattern)中的全部模式** **包括了[go-patterns](https://github.com/tmrts/go-patterns) 和[golang-design-pattern](https://github.com/senghoo/golang-design-pattern)中的全部模式**
@ -9,14 +9,14 @@
**这些模式不是你总结的,也不是我的总结的,如果是你的写的,你可以按照自己的喜欢的感觉给这些套路取名字,让别人去费劲想。** **这些模式不是你总结的,也不是我的总结的,如果是你的写的,你可以按照自己的喜欢的感觉给这些套路取名字,让别人去费劲想。**
## 姿势 ## 姿势 Ways
+ 所谓模式就是套路,如功夫,招有定式 + 所谓模式就是套路,如功夫,招有定式
+ 学习模式,就是学习套路,弄清楚套路要解决的目标场景,这很重要. + 学习模式,就是学习套路,弄清楚套路要解决的目标场景,这很重要.
+ 这里就是以实际代码示例展示设计模式,通俗易懂 + 这里就是以实际代码示例展示设计模式,通俗易懂
+ 除了常见的23种普适的设计模式,Go也有一些属于自己的模式 + 除了常见的23种普适的设计模式,Go也有一些属于自己的模式
## 行为型模式 ## 行为型模式 Behavior Patterns
+ [x] [中介者模式(Mediator)](./behavior/01_mediator) + [x] [中介者模式(Mediator)](./behavior/01_mediator)
+ [x] [闭包选项模式(Function Option)](./behavior/02_option) + [x] [闭包选项模式(Function Option)](./behavior/02_option)
@ -32,7 +32,7 @@
+ [x] [职责链模式(Chain of Responsibility)](./behavior/06_chain_of_responsibility) + [x] [职责链模式(Chain of Responsibility)](./behavior/06_chain_of_responsibility)
## 创建型模式 ## 创建型模式 Creation Patterns
+ [x] [New模式(New)](./creation/01_new) + [x] [New模式(New)](./creation/01_new)
+ [x] [简单工厂模式(Simple Factory)](./creation/02_simple_factory) + [x] [简单工厂模式(Simple Factory)](./creation/02_simple_factory)
@ -44,7 +44,7 @@
+ [x] [原型模式(Prototype)](./creation/07_prototype) + [x] [原型模式(Prototype)](./creation/07_prototype)
## 结构型模式 ## 结构型模式 Structure Patterns
+ [x] [外观模式(Facade)](./structure/01_facade) + [x] [外观模式(Facade)](./structure/01_facade)
+ [x] [适配器模式(Adapter)](./structure/02_adapter) + [x] [适配器模式(Adapter)](./structure/02_adapter)
@ -54,7 +54,7 @@
+ [x] [装饰器模式(Decorator)](./structure/06_decorator) + [x] [装饰器模式(Decorator)](./structure/06_decorator)
+ [x] [代理模式(Proxy)](./structure/07_proxy) + [x] [代理模式(Proxy)](./structure/07_proxy)
## Go More ## 更多 Go More
+ [x] [发布订阅模式(Pub-Sub)](./gomore/01_messages) + [x] [发布订阅模式(Pub-Sub)](./gomore/01_messages)
+ [x] [时差模式(Time Profile)](./gomore/02_profiles) + [x] [时差模式(Time Profile)](./gomore/02_profiles)
@ -72,24 +72,15 @@
## 参考资料(Design patters Articles) ## 参考资料(Design patters Articles)
[go-patterns](https://github.com/crazybber/go-patterns) | Patterns | Design Patterns | Status |
|:-------:|:----------- |:------:|
[design-pattern-tutorial](https://www.runoob.com/design-pattern/design-pattern-tutorial.html) | [go-patterns](https://github.com/crazybber/go-patterns) | [design-pattern-tutorial](https://www.runoob.com/design-pattern/design-pattern-tutorial.html) |p|
| [design_pattern](http://c.biancheng.net/design_pattern)|[golang-design-pattern](https://github.com/senghoo/golang-design-pattern) |p|
[golang-design-pattern](https://github.com/senghoo/golang-design-pattern) [go-resiliency](https://github.com/eapache/go-resiliency) | [Behavioral](https://github.com/AlexanderGrom/go-patterns/tree/master/Behavioral)|v|
| [go-patterns](https://github.com/sevenelevenlee/go-patterns) | [go_design_pattern](https://github.com/monochromegane/go_design_pattern)|p|
[design_pattern](http://c.biancheng.net/design_pattern)
[go-resiliency](https://github.com/eapache/go-resiliency)
[Behavioral](https://github.com/AlexanderGrom/go-patterns/tree/master/Behavioral)
[go-patterns](https://github.com/sevenelevenlee/go-patterns)
[go_design_pattern](https://github.com/monochromegane/go_design_pattern)
## 更多 ## 更多 More
需要重新温习下Go基础?看这里 需要重新温习下Go基础?看这里

View File

@ -1,6 +1,6 @@
# 解释器模式 # 解释器模式
解释器模式就是自己定一套规则、语言、表达方式,也就是所谓的DSL(Domain Specific Language)然后按照定义解析执行DSL常见的自定义协议私有协议就是一个中解释器模式的概念使用者按照协议的规则做事。 解释器模式的本质是就是自己定一套规则、语言、表达方式,也就是所谓的DSL(Domain Specific Language)然后按照定义解析执行DSL常见的自定义协议私有协议就是一个中解释器模式的概念使用者按照协议的规则做事。
解释器模式的意义在于,它分离多种复杂功能的实现,每个功能只需关注自身的解释。 解释器模式的意义在于,它分离多种复杂功能的实现,每个功能只需关注自身的解释。
@ -15,5 +15,4 @@
A "->" B 表示 A说B听,此时B不能发言。 A "->" B 表示 A说B听,此时B不能发言。
A "<-" B 表示 B说A听,此时B不能发言 A "<-" B 表示 B说A听,此时B不能发言
A "<->" B 表示 A 和 B 可以自由发言。 A "<->" B 表示 A 和 B 可以自由发言。
A "-" B 表示 A 和 B 都不能发言,只能倾听。

View File

@ -1,69 +1,147 @@
package interpreter package interpreter
import ( import (
"strconv" "fmt"
"strings" "strings"
) )
//用会议交流的例子 //用会议交流的例子,规则如下:
// A表示左边发言者B表示右边发言者 // A表示左边发言者B表示右边发言者
// A "->" B 表示 A说B听,此时B不能发言。 // A "->" B 表示 A说B听,此时B不能发言。
// A "<-" B 表示 B说A听,此时B不能发言。 // A "<-" B 表示 B说A听,此时B不能发言。
// A "<->" B 表示 A 和 B 可以自由发言。 // A "<->" B 表示 A 和 B 可以自由发言。
// A "-" B 表示 A 和 B 都不能发言,只能倾听。
//IActionInterpret 解释器
type IActionInterpret interface { type IActionInterpret interface {
Interpret() Interpret()
} }
//Speaker 发言者 //SpeakerUnit 每个参与动作的单元都是,会议发言者
type Speaker struct { type SpeakerUnit struct {
Name string Name string
Age int CanSpeak bool //每个参会者有两种基本的行为,发言或者安静
}
//Interpret 解释自己的基本行为
func (s *SpeakerUnit) Interpret() {
if s.CanSpeak {
fmt.Println("i'm", s.Name, "im speaking")
return
}
fmt.Println("i'm", s.Name, "already silent")
}
//LeftSpeakAction A "->" B 表示 A说B听,此时B不能发言。
type LeftSpeakAction struct {
leftSpeaker, rightSpeaker IActionInterpret
}
//Interpret 解释执行
func (l *LeftSpeakAction) Interpret() {
l.leftSpeaker.Interpret()
l.rightSpeaker.Interpret()
} }
func (s *Speaker) Interpret() { //RightSpeakAction A "<-" B 表示 B说A听,此时B不能发言。
type RightSpeakAction struct {
leftSpeaker, rightSpeaker IActionInterpret
} }
//LeftIntroduce A向B介绍自己 //Interpret 解释执行
type LeftIntroduce struct { func (r *RightSpeakAction) Interpret() {
leftSpeaker, rightSpeaker Speaker r.leftSpeaker.Interpret()
r.rightSpeaker.Interpret()
} }
//BothSpeakAction : A "<->" B 表示 A 和 B 可以自由发言。
func (l *LeftIntroduce) Interpret() { type BothSpeakAction struct {
leftSpeaker, rightSpeaker IActionInterpret
} }
//RightIntroduce B向A介绍自己 //Interpret 解释执行
type RightIntroduce struct { func (b *BothSpeakAction) Interpret() {
leftSpeaker, rightSpeaker Speaker b.leftSpeaker.Interpret()
b.rightSpeaker.Interpret()
} }
func (n *MinNode) Interpret() int { //SignParser 我们自己的DSL解析器
return n.left.Interpret() - n.right.Interpret()
}
//标识解析器
type SignParser struct { type SignParser struct {
actionsMark []string actionUnits []string //要解析的内容
result IActionInterpret //上一个也是解释器单元
} }
//Parse 标识解析器进行解析 //解析 ->
func (p *SignParser) Parse(exp string) { func (s *SignParser) newLeftSpeakAction() IActionInterpret {
p.exp = strings.Split(exp, " ")
s := p.actionsMark[0] left := &SpeakerUnit{
for len(s) >0 { Name: s.actionUnits[0],
switch s.actionsMark[0] { CanSpeak: true,
}
} right := &SpeakerUnit{
Name: s.actionUnits[2],
}
return &LeftSpeakAction{
leftSpeaker: left,
rightSpeaker: right,
} }
} }
//解析 <-
func (s *SignParser) newRightSpeakAction() IActionInterpret {
left := &SpeakerUnit{
Name: s.actionUnits[0],
}
right := &SpeakerUnit{
Name: s.actionUnits[2],
CanSpeak: true,
}
return &LeftSpeakAction{
leftSpeaker: left,
rightSpeaker: right,
}
}
//解析 <->
func (s *SignParser) newBothSpeakAction() IActionInterpret {
left := &SpeakerUnit{
Name: s.actionUnits[0],
CanSpeak: true,
}
right := &SpeakerUnit{
Name: s.actionUnits[2],
CanSpeak: true,
}
return &LeftSpeakAction{
leftSpeaker: left,
rightSpeaker: right,
}
}
//Parse 标识解析器进行解析exp就是要解释的内容
func (s *SignParser) Parse(exp string) {
s.actionUnits = strings.Split(exp, " ") //单元分割符
switch s.actionUnits[1] {
case "->":
s.result = s.newLeftSpeakAction()
case "<-":
s.result = s.newRightSpeakAction()
case "<->":
s.result = s.newBothSpeakAction()
default:
fmt.Println("some error raised")
}
}
//Result 就是两边正确执行了动作
func (s *SignParser) Result() {
s.result.Interpret()
}

View File

@ -5,40 +5,54 @@ import (
"strings" "strings"
) )
type Node interface { //解释自定义的加减法运算
//输入:字符串
//输出:整数值
//将一个包含加减运算的字符串,正常解析出结果
//Element 每个元素的解释接口
type Element interface {
Interpret() int Interpret() int
} }
type ValNode struct { //ValElement 值节点
type ValElement struct {
val int val int
} }
func (n *ValNode) Interpret() int { //Interpret 值解析单元的返回值
func (n *ValElement) Interpret() int {
return n.val return n.val
} }
type AddNode struct { //AddOperate Operation(+)
left, right Node type AddOperate struct {
left, right Element
} }
func (n *AddNode) Interpret() int { //Interpret AddOperate
func (n *AddOperate) Interpret() int {
return n.left.Interpret() + n.right.Interpret() return n.left.Interpret() + n.right.Interpret()
} }
type MinNode struct { //MinOperate Operation(-)
left, right Node type MinOperate struct {
left, right Element
} }
func (n *MinNode) Interpret() int { //Interpret MinOperate
func (n *MinOperate) Interpret() int {
return n.left.Interpret() - n.right.Interpret() return n.left.Interpret() - n.right.Interpret()
} }
//Parser machine
type Parser struct { type Parser struct {
exp []string exp []string
index int index int
prev Node prev Element
} }
//Parse content
func (p *Parser) Parse(exp string) { func (p *Parser) Parse(exp string) {
p.exp = strings.Split(exp, " ") p.exp = strings.Split(exp, " ")
@ -48,39 +62,40 @@ func (p *Parser) Parse(exp string) {
} }
switch p.exp[p.index] { switch p.exp[p.index] {
case "+": case "+":
p.prev = p.newAddNode() p.prev = p.newAddOperte()
case "-": case "-":
p.prev = p.newMinNode() p.prev = p.newMinOperte()
default: default:
p.prev = p.newValNode() p.prev = p.newValElement()
} }
} }
} }
func (p *Parser) newAddNode() Node { func (p *Parser) newAddOperte() Element {
p.index++ p.index++
return &AddNode{ return &AddOperate{
left: p.prev, left: p.prev,
right: p.newValNode(), right: p.newValElement(),
} }
} }
func (p *Parser) newMinNode() Node { func (p *Parser) newMinOperte() Element {
p.index++ p.index++
return &MinNode{ return &MinOperate{
left: p.prev, left: p.prev,
right: p.newValNode(), right: p.newValElement(),
} }
} }
func (p *Parser) newValNode() Node { func (p *Parser) newValElement() Element {
v, _ := strconv.Atoi(p.exp[p.index]) v, _ := strconv.Atoi(p.exp[p.index])
p.index++ p.index++
return &ValNode{ return &ValElement{
val: v, val: v,
} }
} }
func (p *Parser) Result() Node { //Result of parsing result
func (p *Parser) Result() Element {
return p.prev return p.prev
} }

View File

@ -2,7 +2,28 @@ package interpreter
import "testing" import "testing"
func TestInterpreter(t *testing.T) { func TestMeetingActionSignInterpreter(t *testing.T) {
p := &SignParser{}
p.Parse("rose -> tom")
p.Result()
p.Parse("rose <-> tom")
p.Result()
p.Parse("rose <- tom")
p.Result()
//should error
p.Parse("rose + tom")
p.Result()
}
func TestCalculatorInterpreter(t *testing.T) {
p := &Parser{} p := &Parser{}
p.Parse("1 + 2 + 3 - 4 + 5 - 6") p.Parse("1 + 2 + 3 - 4 + 5 - 6")
res := p.Result().Interpret() res := p.Result().Interpret()