在对象去耦合的模式中,有两种模式:中介者模式,观察者模式
一,概念
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
这个模式我们可以简单的类比于星型结构,中介者就是中心,其他对象的交互都是通过中心的中介者作为媒介,而不是直接交互,这样就避免了对象直接交互导致的关系混乱,不易维护的缺点。
二,类图
Mediator为抽象的中介者,它定义了与抽象Colleague交互的一般行为,ConcreteMediator为ConcreteColleague定义了更加具体的行为,通过子类化中介者(Mediator),把各种Colleague交互行为应用到相同或者不同的colleague类型。Colleague的实例有一个中介者(Mediator)实例的引用,同时中介者的实例知道参与这个组织的每个对象。每一个ConcreteColleague只知道自己的交互行为,不知道其他的ConcreteColleague的行为,但是它们都知道ConcreteMediator对象。如果应用中只需要一个中介者,有时可以省去抽象的Mediator。
三,代码演示
Mediator
protocol MediatorProtocol { func showImage(data: Data) func memberNum(data: Data) func storageData(data: Data) func arithmetic(data: Data) }
ConcreteMediator
class MainBoard: MediatorProtocol { var cpu: ColleagueProtocol? var memory: ColleagueProtocol? var disk: ColleagueProtocol? var graphics: ColleagueProtocol? func showImage(data: Data) { graphics?.operation(data: Data()) } func memberNum(data: Data) { memory?.operation(data: Data()) } func storageData(data: Data) { disk?.operation(data: Data()) } func arithmetic(data: Data) { cpu?.operation(data: Data()) } }
Colleague
protocol ColleagueProtocol { var mediator: MediatorProtocol{get} init(mediator: MediatorProtocol) func operation(data: Data) }
ColleagueConcrete
class CPU: ColleagueProtocol { var mediator: MediatorProtocol required init(mediator: MediatorProtocol) { self.mediator = mediator } func operation(data: Data) { print("cpu operation data \(data)") } func showImage() { mediator.showImage(data: Data()) } }
class Memory: ColleagueProtocol { var mediator: MediatorProtocol required init(mediator: MediatorProtocol) { self.mediator = mediator } func operation(data: Data) { print("Memory member data \(data)") } func storageData() { mediator.storageData(data: Data()) } }
class Disk: ColleagueProtocol { var mediator: MediatorProtocol required init(mediator: MediatorProtocol) { self.mediator = mediator } func operation(data: Data) { print("Disk storage data \(data)") } }
class Graphics: ColleagueProtocol { var mediator: MediatorProtocol required init(mediator: MediatorProtocol) { self.mediator = mediator } func operation(data: Data) { print("Graphics show data \(data)") } }
Client
class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let mainboard = MainBoard() let cpu = CPU(mediator: mainboard) mainboard.cpu = cpu let memeory = Memory(mediator: mainboard) mainboard.memory = memeory mainboard.disk = Disk(mediator: mainboard) mainboard.graphics = Graphics(mediator: mainboard) cpu.showImage() memeory.storageData() } }