mirror of
https://github.com/crazybber/go-pattern-examples.git
synced 2024-11-22 11:56:03 +03:00
add mediator pattern
This commit is contained in:
parent
0453d8f5aa
commit
e8888bd560
@ -3,3 +3,5 @@
|
|||||||
也叫中间人模式,设计模式的核心理念就是封装变化点,中介模式顾名思义,就是在有关系的两方之间引入中间人,使得中介两边都可以自由变化。
|
也叫中间人模式,设计模式的核心理念就是封装变化点,中介模式顾名思义,就是在有关系的两方之间引入中间人,使得中介两边都可以自由变化。
|
||||||
|
|
||||||
现实生活的中的租房中介/职业介绍都是中介者模式的实际典型代表.
|
现实生活的中的租房中介/职业介绍都是中介者模式的实际典型代表.
|
||||||
|
|
||||||
|
庞大的中介平台Online就是一个中介者模式的系统的实现.
|
||||||
|
@ -2,61 +2,53 @@ package mediator
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CDDriver struct {
|
//在这个模式里面,我们演示一个场景用例
|
||||||
Data string
|
//房东通过中介向房客收房租
|
||||||
|
//房客通过中介向房东要求换新家具
|
||||||
|
//中介每次服务都收100块服务费
|
||||||
|
|
||||||
|
//Person 定义一个本身的人
|
||||||
|
type Person struct {
|
||||||
|
Name string
|
||||||
|
MoneyCount int //每个人都有钱包
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CDDriver) ReadData() {
|
//Tenant 租客
|
||||||
c.Data = "music,image"
|
type Tenant struct {
|
||||||
|
Person
|
||||||
|
}
|
||||||
|
|
||||||
|
//Landlord 房东,要收房租
|
||||||
|
type Landlord struct {
|
||||||
|
Person
|
||||||
|
accout int //房东的租金账户
|
||||||
|
}
|
||||||
|
|
||||||
|
//mediator 中介,比如某居客,某家,某壳,即代表租客跟房东谈条件,又代表房东对付租客
|
||||||
|
//mediator 所以中介一定会持有两方的信息,最好用接口代表对象
|
||||||
|
//mediator 这里简化一下,直接用类型的引用,表示拥有关系
|
||||||
|
type mediator struct {
|
||||||
|
tenant *Tenant
|
||||||
|
landlord *Landlord
|
||||||
|
feeLandlord int //向房东收费的账户
|
||||||
|
feeTenant int //向租客收费的账户
|
||||||
|
}
|
||||||
|
|
||||||
|
//AskRepair 要求房东修家具
|
||||||
|
func (c *tenant) AskRepair(furniture string) {
|
||||||
fmt.Printf("CDDriver: reading data %s\n", c.Data)
|
fmt.Printf("CDDriver: reading data %s\n", c.Data)
|
||||||
GetMediatorInstance().changed(c)
|
GetMediatorInstance().changed(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
type CPU struct {
|
//CollectRent 房东收租金了
|
||||||
Video string
|
func (l *landlord) CollectRent(moneyCount int) {
|
||||||
Sound string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *CPU) Process(data string) {
|
|
||||||
sp := strings.Split(data, ",")
|
|
||||||
c.Sound = sp[0]
|
|
||||||
c.Video = sp[1]
|
|
||||||
|
|
||||||
fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video)
|
fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video)
|
||||||
GetMediatorInstance().changed(c)
|
GetMediatorInstance().changed(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
type VideoCard struct {
|
|
||||||
Data string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (v *VideoCard) Display(data string) {
|
|
||||||
v.Data = data
|
|
||||||
fmt.Printf("VideoCard: display %s\n", v.Data)
|
|
||||||
GetMediatorInstance().changed(v)
|
|
||||||
}
|
|
||||||
|
|
||||||
type SoundCard struct {
|
|
||||||
Data string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *SoundCard) Play(data string) {
|
|
||||||
s.Data = data
|
|
||||||
fmt.Printf("SoundCard: play %s\n", s.Data)
|
|
||||||
GetMediatorInstance().changed(s)
|
|
||||||
}
|
|
||||||
|
|
||||||
type Mediator struct {
|
|
||||||
CD *CDDriver
|
|
||||||
CPU *CPU
|
|
||||||
Video *VideoCard
|
|
||||||
Sound *SoundCard
|
|
||||||
}
|
|
||||||
|
|
||||||
var mediator *Mediator
|
var mediator *Mediator
|
||||||
|
|
||||||
func GetMediatorInstance() *Mediator {
|
func GetMediatorInstance() *Mediator {
|
||||||
|
3
behavior/README.md
Normal file
3
behavior/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# 行为模式
|
||||||
|
|
||||||
|
对象之间产生行为关系的一些固定套路
|
@ -1,5 +1,5 @@
|
|||||||
# 外观模式
|
# 外观模式
|
||||||
|
|
||||||
API 为facade 模块的外观接口,大部分代码使用此接口简化对facade类的访问。
|
又称门面模式,APIs Gateway就是一种facade模式的,用户只要通过APIs就可访问系统功能.
|
||||||
|
|
||||||
facade模块同时暴露了a和b 两个Module 的NewXXX和interface,其它代码如果需要使用细节功能时可以直接调用。
|
Service Desk 或者Calling Center 呼叫中心也是典型门面模式场景,对一些问题的处理和访问,都通过一个集中的入口统一访问.
|
||||||
|
Loading…
Reference in New Issue
Block a user