From e8888bd560ec418328cdeba84e1165a10629e8f8 Mon Sep 17 00:00:00 2001 From: Edward Date: Mon, 27 Apr 2020 17:43:39 +0800 Subject: [PATCH] add mediator pattern --- behavior/08_mediator/README.md | 2 + behavior/08_mediator/mediator.go | 74 ++++++++++++++------------------ behavior/README.md | 3 ++ structure/01_facade/README.md | 4 +- 4 files changed, 40 insertions(+), 43 deletions(-) create mode 100644 behavior/README.md diff --git a/behavior/08_mediator/README.md b/behavior/08_mediator/README.md index f908e80..b7f6197 100644 --- a/behavior/08_mediator/README.md +++ b/behavior/08_mediator/README.md @@ -3,3 +3,5 @@ 也叫中间人模式,设计模式的核心理念就是封装变化点,中介模式顾名思义,就是在有关系的两方之间引入中间人,使得中介两边都可以自由变化。 现实生活的中的租房中介/职业介绍都是中介者模式的实际典型代表. + +庞大的中介平台Online就是一个中介者模式的系统的实现. diff --git a/behavior/08_mediator/mediator.go b/behavior/08_mediator/mediator.go index e5a1c1d..9797e75 100644 --- a/behavior/08_mediator/mediator.go +++ b/behavior/08_mediator/mediator.go @@ -2,61 +2,53 @@ package mediator import ( "fmt" - "strings" ) -type CDDriver struct { - Data string +//在这个模式里面,我们演示一个场景用例 +//房东通过中介向房客收房租 +//房客通过中介向房东要求换新家具 +//中介每次服务都收100块服务费 + +//Person 定义一个本身的人 +type Person struct { + Name string + MoneyCount int //每个人都有钱包 } -func (c *CDDriver) ReadData() { - c.Data = "music,image" +//Tenant 租客 +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) GetMediatorInstance().changed(c) } -type CPU struct { - Video string - Sound string -} - -func (c *CPU) Process(data string) { - sp := strings.Split(data, ",") - c.Sound = sp[0] - c.Video = sp[1] +//CollectRent 房东收租金了 +func (l *landlord) CollectRent(moneyCount int) { fmt.Printf("CPU: split data with Sound %s, Video %s\n", c.Sound, c.Video) 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 func GetMediatorInstance() *Mediator { diff --git a/behavior/README.md b/behavior/README.md new file mode 100644 index 0000000..4a5b1c0 --- /dev/null +++ b/behavior/README.md @@ -0,0 +1,3 @@ +# 行为模式 + +对象之间产生行为关系的一些固定套路 diff --git a/structure/01_facade/README.md b/structure/01_facade/README.md index eb2570a..7deba46 100644 --- a/structure/01_facade/README.md +++ b/structure/01_facade/README.md @@ -1,5 +1,5 @@ # 外观模式 -API 为facade 模块的外观接口,大部分代码使用此接口简化对facade类的访问。 +又称门面模式,APIs Gateway就是一种facade模式的,用户只要通过APIs就可访问系统功能. -facade模块同时暴露了a和b 两个Module 的NewXXX和interface,其它代码如果需要使用细节功能时可以直接调用。 +Service Desk 或者Calling Center 呼叫中心也是典型门面模式场景,对一些问题的处理和访问,都通过一个集中的入口统一访问.