中介者模式
2019-03-31 本文已影响0人
一毛钱
中介者模式-定义
别名:调解者模式、调停者模式
包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以降低耦合(松散耦合)。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理
中介者模式-应用场景
当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可以采用中介者模式来解决紧耦合问题。
核心:解决耦合问题
中介者模式-角色划分
4个核心角色
角色一:Mediator(抽象中介者)
角色二:ConcreteMediator(具体中介者)
角色三:Colleague(抽象同事)
角色四:ConcreteColleague(具体同事)
中介者模式-原理案例
角色一:ComputerMediator->电脑(很多种类)->中介者
华为、苹果、三星…
角色二:SXComputerMediator->具体电脑
角色三:ComputerColleague->抽象同事 零件:主板、CPU、显示器…
角色四:CPU、DisplayCard、Mainboard->具体同事
//中介者->抽象中介者 角色一: 抽象中介者
//特点:持有同事引用
class ComputerMediator: NSObject {
func changed(colleague:ComputerColleague) {
}
}
// 角色二 具体中介者
//中介者调度CPU、DisplayCard、SoundCard、CDCard
//通过中介者接触耦合
class SXComputerMediator: ComputerMediator {
private var cpu:CPU?
private var displayCard:DisplayCard?
private var soundCard:SoundCard?
private var cdDevice:CDDevice?
func setCPU(cpu:CPU) {
self.cpu = cpu
}
func setDisplayCard(displayCard:DisplayCard) {
self.displayCard = displayCard
}
func setSoundCard(soundCard:SoundCard) {
self.soundCard = soundCard
}
func setCDDevice(cdDevice:CDDevice) {
self.cdDevice = cdDevice
}
//架构思维->被案例迷惑了->结构搞明白了
override func changed(colleague: ComputerColleague) {
if colleague == cpu {
self.handleCD(cpu: colleague as! CPU)
} else if colleague == cdDevice {
self.handleCD(cd: colleague as! CDDevice)
}
}
//CPU读取数据->显示过程
//解析数据
private func handleCD(cd:CDDevice) {
cpu?.decodeData(data: cd.read())
}
//设备交互
private func handleCD(cpu:CPU) {
self.soundCard?.soundPlay(data: cpu.getSoundData())
self.displayCard?.videoPlay(data: cpu.getVideoData())
}
}
//角色三: 抽象同事
class ComputerColleague: NSObject {
var mediator:ComputerMediator
init(mediator:ComputerMediator) {
self.mediator = mediator
}
}
//角色四:具体同事 CPU
class CPU: ComputerColleague {
//视频数据
private var videoData:String?
//音频数据
private var soundData:String?
override init(mediator: ComputerMediator) {
super.init(mediator: mediator)
}
func getVideoData() -> String {
return self.videoData!
}
func getSoundData() -> String {
return self.soundData!
}
func decodeData(data:String) {
let array = data.split(separator: ",").map(String.init)
self.videoData = array[0]
self.soundData = array[1]
mediator.changed(colleague: self)
}
}
//角色四:具体同事,显卡
class DisplayCard: ComputerColleague {
override init(mediator: ComputerMediator) {
super.init(mediator: mediator)
}
//播放视频数据
func videoPlay(data:String) {
print("播放视频...")
}
}
//角色四:具体同事 声卡
class SoundCard: ComputerColleague {
override init(mediator: ComputerMediator) {
super.init(mediator: mediator)
}
//播放视频数据
func soundPlay(data:String) {
print("播放音频...")
}
}
//角色四:具体同事 设备CD
//CD设备->负责读取光盘数据传递给电脑主板
class CDDevice: ComputerColleague {
private var data:String?
override init(mediator: ComputerMediator) {
super.init(mediator: mediator)
}
func read() -> String {
return self.data!
}
func load() {
//数据格式
self.data = "视频数据,音频数据"
mediator.changed(colleague: self)
}
}
//外部调用
let mediator = SXComputerMediator()
//零件->同事
let cpu = CPU(mediator: mediator)
let displayCard = DisplayCard(mediator: mediator)
let cdDevice = CDDevice(mediator: mediator)
let soundCard = SoundCard(mediator: mediator)
mediator.setCPU(cpu: cpu)
mediator.setSoundCard(soundCard: soundCard)
mediator.setDisplayCard(displayCard: displayCard)
mediator.setCDDevice(cdDevice: cdDevice)
//开始播放->开始放影片
cdDevice.load()
说实话,这个例子总觉得存在点问题,需要在考虑,待优化。