add mediator pattern

This commit is contained in:
Edward 2020-04-27 17:43:39 +08:00
parent 0453d8f5aa
commit e8888bd560
4 changed files with 40 additions and 43 deletions

View File

@ -3,3 +3,5 @@
也叫中间人模式,设计模式的核心理念就是封装变化点,中介模式顾名思义,就是在有关系的两方之间引入中间人,使得中介两边都可以自由变化。 也叫中间人模式,设计模式的核心理念就是封装变化点,中介模式顾名思义,就是在有关系的两方之间引入中间人,使得中介两边都可以自由变化。
现实生活的中的租房中介/职业介绍都是中介者模式的实际典型代表. 现实生活的中的租房中介/职业介绍都是中介者模式的实际典型代表.
庞大的中介平台Online就是一个中介者模式的系统的实现.

View File

@ -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
View File

@ -0,0 +1,3 @@
# 行为模式
对象之间产生行为关系的一些固定套路

View File

@ -1,5 +1,5 @@
# 外观模式 # 外观模式
API 为facade 模块的外观接口大部分代码使用此接口简化对facade类的访问。 又称门面模式APIs Gateway就是一种facade模式的用户只要通过APIs就可访问系统功能.
facade模块同时暴露了a和b 两个Module 的NewXXX和interface其它代码如果需要使用细节功能时可以直接调用。 Service Desk 或者Calling Center 呼叫中心也是典型门面模式场景,对一些问题的处理和访问,都通过一个集中的入口统一访问.