中介者模式

中介者模式-定义

别名:调解者模式、调停者模式
包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以降低耦合(松散耦合)。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理

中介者模式-应用场景

当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可以采用中介者模式来解决紧耦合问题。
核心:解决耦合问题

中介者模式-角色划分

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()

说实话,这个例子总觉得存在点问题,需要在考虑,待优化。

你可能感兴趣的:(中介者模式)