GoLang设计模式10 - 中介者模式
中介者模式是一种行为型设计模式。在中介者模式中创建了一个中介对象来负责不同类间的通信。因为这些类不需要直接交互,所以也就能避免它们之间的直接依赖,实现解耦的效果。
中介者模式的一个典型案例是老式小火车站。为保证铁路系统稳定运行,两列火车一般不会直接通信,而是听从车站管理员的调度。这里车站管理员就是一个中介者。他维护着一个火车进站的调度表,让火车站一次只允许一列火车停靠。当一列火车离开车站时,他才会通知调度表中的下一趟火车进站。
下面的代码模拟了小火车站管理员调度火车的工作。
火车接口 train.go :
type train interface { requestArrival() departure() permitArrival()
}
客车类(passengerTrain)和货车类(goodsTrain)分别实现了train
接口。
passengerTrain.go :
import "fmt" type passengerTrain struct {
mediator mediator
} func (g *passengerTrain) requestArrival() {
if g.mediator.canLand(g) {
fmt.Println("PassengerTrain: Landing")
} else {
fmt.Println("PassengerTrain: Waiting")
}
} func (g *passengerTrain) departure() {
fmt.Println("PassengerTrain: Leaving")
g.mediator.notifyFree()
} func (g *passengerTrain) permitArrival() {
fmt.Println("PassengerTrain: Arrival Permitted. Landing")
}
goodsTrain.go :
import "fmt" type goodsTrain struct {
mediator mediator
} func (g *goodsTrain) requestArrival() {
if g.mediator.canLand(g) {
fmt.Println("GoodsTrain: Landing")
} else {
fmt.Println("GoodsTrain: Waiting")
}
} func (g *goodsTrain) departure() {
g.mediator.notifyFree()
fmt.Println("GoodsTrain: Leaving")
} func (g *goodsTrain) permitArrival() {
fmt.Println("GoodsTrain: Arrival Permitted. Landing")
}
中介者接口 mediator.go:
type mediator interface { canLand(train) bool notifyFree()
}
车站管理员实现了mediator
接口, stationManager.go:
import "sync" type stationManager struct {
isPlatformFree bool
lock *sync.Mutex
trainQueue []train
} func newStationManger() *stationManager {
return &stationManager{
isPlatformFree: true,
lock: &sync.Mutex{},
}
} func (s *stationManager) canLand(t train) bool {
s.lock.Lock()
defer s.lock.Unlock()
if s.isPlatformFree {
s.isPlatformFree = false
return true
}
s.trainQueue = append(s.trainQueue, t)
return false
} func (s *stationManager) notifyFree() {
s.lock.Lock()
defer s.lock.Unlock()
if !s.isPlatformFree {
s.isPlatformFree = true
}
if len(s.trainQueue) > 0 {
firstTrainInQueue := s.trainQueue[0]
s.trainQueue = s.trainQueue[1:]
firstTrainInQueue.permitArrival()
}
}
main.go:
func main() {
stationManager := newStationManger()
passengerTrain := &passengerTrain{
mediator: stationManager,
}
goodsTrain := &goodsTrain{
mediator: stationManager,
}
passengerTrain.requestArrival()
goodsTrain.requestArrival()
passengerTrain.departure()
}
执行结果:
PassengerTrain: Landing
GoodsTrain: Waiting
PassengerTrain: Leaving
GoodsTrain: Arrival Permitted. Landing
代码已上传至GitHub: zhyea / go-patterns / mediator-pattern
END!
GoLang设计模式10 - 中介者模式的更多相关文章
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 折腾Java设计模式之中介者模式
博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...
- js设计模式——8.中介者模式
js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...
- 【设计模式】行为型10中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 这里笔者完全参考了:http://www.runoob.com/design-pattern/mediator-pattern.html,案例精 ...
- Java 设计模式之中介者模式
本文继续23种设计模式系列之中介者模式. 定义 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 角色 抽象中介者: ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 【GOF23设计模式】中介者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 再起航,我的学习笔记之JavaScript设计模式23(中介者模式)
中介者模式 概念介绍 中介者模式(Mediator):通过中介者对象封装一系列对象之间的交互,使对象之间不再相互引用降低他们之间的耦合,有时中介者对象也可以改变对象之间的交互. 创建一个中介 中介者模 ...
随机推荐
- centos7 grep 的使用
2021-07-29 grep(Global search Regular Expression and Print out the line) "Global search" 表 ...
- 手写个jsonp
原生jsonp具体实现 先上代码: //http://www.baidu.com?aa=11&callback=my_jsonp04349289664328899 var jsonp = fu ...
- Sublime Text 快速分别独立选中多行
效果图 直接上代码 import sublime, sublime_plugin # 独立选择每一行(在当前选中范围内) class SelectEverySingleLine(sublime_plu ...
- java基础之ThreadLocal
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序.Thr ...
- C# 给PPT中的图表添加趋势线
本文内容分享通过C#程序代码给PPT文档中的图表添加数据趋势线的方法. 支持趋势线的图表类型包括二维面积图.条形图.柱形图.柱形图.股价图.xy (散点图) 和气泡图中:不能向三维.堆积.雷达图.饼图 ...
- Selenium系列(八) - 截取完整页面和截取指定元素并保存为图片
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- JS015. 数据存储方式与位置(堆内存、栈内存、指针)
数据 - 基本类型 Undefined , Null , String , Number , Boolean , Symbol (ES 6) , 基本数据类型存储在栈内存中. 数 ...
- HiveServer2的负载均衡高可用与ActicePassive高可用浅析
负载均衡的高可用 最近在工作中遇到了hiveserver2需要部署高可用的场景,去网上搜索了解过后,用了绝大多数人推荐的共同方法: Property_name Property_value Descr ...
- 华为云计算IE面试笔记-FusionCompute上的虚拟机A和虚拟机B不能正常通信,请描述可能的故障点和排除方法(分析虚拟机A和虚拟机B不通)
*快速定位故障点:(考到) ARP:同一二层内可以通过ARP -a命令查询到要访问的主机IP(ARP表项中记录了同一二层中的IP和MAC的对应关系),若查询不到,说明二层出现问题(Vlan 间不通)或 ...
- 疏忽Bug
仅供自己留存备份 错误: vector不是模板 解决: 头文件未包含 头文件: #include <vector> using namespace std; 错误: 多字节字符 ...