中介者模式:设计模式系列(五)
in Archived / Pattern
中介者模式(Mediator Pattern):是从一类同本质的对象中抽象出一个中介,是这些对象在相互作用时通过中介完成,使耦合松散的设计模式,归类为行为型模式。
这一模式的解读分为以下几个方面:
- 有很多同本质的实例对象,他们之间会产生相互作用。
- 中介类为这些同本质对象进行中间跑腿工作。
使用中介者模式的思考过程如下:
- 有很多对象希望互相联系作用,但一对一在少数对象的时候还能兼顾,对象数量变大后,对象间联系作用再使用一对一就变得复杂了。
- 中介者对象就是一系列相互作用对象的中间点,能再其中做出协调,简单地可以理解为帮助各个对象跑腿传递作用。
那么再明确一下结构,中介抽象出来的接口或协议、中介实现类、需要互相作用的实现类(多个)。
中介者模式示例代码如下(Swift语言):
protocol MediatorBluePrint{
static func transferFrom(object:ObjectBluePrint,to:ObjectBluePrint,msg:String);
}
class Mediator:MediatorBluePrint{
private static let mediator = Mediator();
private init(){}
static func transferFrom(object:ObjectBluePrint,to:ObjectBluePrint,msg:String){
to.setOtherName(object.getName());
to.setOtherMessage(msg);
}
}
protocol ObjectBluePrint{
func getName()->String;
func setOtherName(otherName:String);
func setOtherMessage(msg:String);
func show();
func tellTo(object:ObjectBluePrint,message:String);
}
class Object1: ObjectBluePrint {
var name = "object1";
var otherName:String?;
var otherMessage:String?;
func getName()->String{
return self.name;
}
func setOtherName(otherName:String){
self.otherName = otherName;
}
func setOtherMessage(msg:String){
self.otherMessage = msg;
}
func show(){
print("Here is \(name)");
print("Message:\(otherMessage!) From:\(otherName!)");
}
func tellTo(object:ObjectBluePrint,message:String){
Mediator.transferFrom(self, to: object, msg: message);
}
}
class Object2: ObjectBluePrint {
var name = "object2";
var otherName:String?;
var otherMessage:String?;
func getName()->String{
return self.name;
}
func setOtherName(otherName:String){
self.otherName = otherName;
}
func setOtherMessage(msg:String){
self.otherMessage = msg;
}
func show(){
print("Here is \(name)");
print("Message:\(otherMessage!) From:\(otherName!)");
}
func tellTo(object:ObjectBluePrint,message:String){
Mediator.transferFrom(self, to: object, msg: message);
}
}
var o1:ObjectBluePrint = Object1();
var o2:ObjectBluePrint = Object2();
o1.tellTo(o2,message: "I am from Object1,nice to meet you");
o2.show();
o2.tellTo(o1, message: "I come from Object2,nice to meet you,too");
o1.show();
代码分析:示例代码有点长,原意是想更详细地解释这一模式,可以看到Object1
和Object2
都是本质一样的实现类,ObjectBluePrint
可以理解为本质,假如两者之间进行联系作用的话,其实直接联系就可以了,但假如继续出现Object3
、Object4
…等等很多的实现对象的时候,使用中介者模式就能起到很好的作用了,如上代码所示的Mediator
便是中介者实现类,在这里我把它写成了单例模式,便于被Object1
、Object2
调用,同时,当相互交互的实现类对象要对其它对象进行相互作用的时候,就能调用tellTo
方法,告知中介者Mediator
进行操作,而中介者transferFrom
方法的三个参数则是保留了“谁”发给“谁”了“什么信息”的意思,最后整个代码运行了之后,接收对象接收后可以进行显示。以下是代码示例的输出结果:
Here is object2
Message:I am from Object1,nice to meet you From:object1
Here is object1
Message:I come from Object2,nice to meet you,too From:object2
总结:中介者模式给人感觉像是电信运营商,人们打电话不是直接连线给目标,而是先联系了运营商,再由运营商转给目标,中间过程需要用户向运营商注册,而运营商在转发之前也是需要搜索相关目标,这中模式在大量的相互作用对象之间是很实用的,同时也能降低耦合。