简述
调停者模式(Mediator pattern)软件设计模式的一种,用于模块间解耦,通过避免对象互相显式的指向对方从而降低耦合。
整合核心于决策核心
主板式汇集众多接口的整合体,其中最特殊的接口是它于CPU之间的接口,如图:
CPU本身包容了非常复杂的运算逻辑,而MB又通过接口将它包容进来,展现MB的极大包容力,而且至今MB的包容力仍然日益增强钟。
这种结构并不局限于硬件上,软件上也很常见:
Mediator=整合核心+决策核心
问题
① 多个对象重复访问,无规律性。
② 一个对象集合的交互良好定义,但是交互方式复杂。通常有非结构依赖。
③ 对象复用困难,因为对象指向和交互很多其他的对象
④ 在多个类之间的分布式行为的控制问题:应该不用建立很多子类就是先本地化
参与者说明
①
Mediator: 定义了与colleague对象交互的接口,通常被告知事件或者状态
②
concreteMediator:实现与colleague交互的具体行为,了解和维护colleagues
③ colleague: 每个colleague知道自己的Mediator对象,每个colleague当其需要与其他colleague交互时需要先与自己的mediator进行交互,为mediator提供了服务,colleague可能请求相同也可能不同
结果
① 定义对象,其封装了一组对象的交互方式
② Mediator促进低耦合,通过纺织对象显示的引用彼此;
③ 让人独立的拓展其交互 集中式控制
Colleague抽象类别定义了mediator指针可以参考到Mediator类别体系的对象。而ConcreteColleague1、
ConcreteColleague2等类别都继承了这mediator指针,因此ConcreteColleague1、ConcreteColleague2等类别的对象可以接着mediator指针而传送讯息给Mediator的对象。
应用
一、在Android开发中Activity一般就适合担任协调者的角色,如图:
ac01扮演了整个View间的互动与合作的协调者。
二、Android的Binder Kernel:
Demo
未运用中介模式前的实现:
abstract class Person {
private String name;
private int condition;
public Person(String name, int condition) {
this.name = name;
this.condition = condition;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCondition() {
return condition;
}
public void setCondition(int condition) {
this.condition = condition;
}
public abstract void getPartner(Person person);
}
class Man extends Person {
public Man(String name, int condition) {
super(name, condition);
}
public void getPartner(Person person) {
if (person instanceof Man) {
System.out.println("汗,我不是同性恋!");
} else {
if (this.getCondition() == person.getCondition()) {
System.out.println(this.getName() + "和" + person.getName()
+ "绝配");
} else {
System.out.println(this.getName() + "和" + person.getName()
+ "不相配");
}
}
}
}
class Woman extends Person {
public Woman(String name, int condition) {
super(name, condition);
}
public void getPartner(Person person) {
if (person instanceof Woman) {
System.out.println("汗,我不是同性恋!");
} else {
if (this.getCondition() == person.getCondition()) {
System.out.println(this.getName() + "和" + person.getName()
+ "绝配");
} else {
System.out.println(this.getName() + "和" + person.getName()
+ "不相配");
}
}
}
}
public class Test {
public static void main(String[] args) {
Person zhangsan = new Man("张三", 5);
Person lisi = new Man("李四", 6);
Person xiaofang = new Woman("小芳", 6);
zhangsan.getPartner(xiaofang);
lisi.getPartner(xiaofang);
zhangsan.getPartner(lisi);
/*张三和小芳不相配
李四和小芳绝配
汗,我不是同性恋!*/
}
}
运用了中介模式的代码:
class Mediator {
private Man man;
private Woman woman;
public void setMan(Man man) {
this.man = man;
}
public void setWoman(Woman woman) {
this.woman = woman;
}
public void getPartner(Person person) {
// 将搭档设置上
if (person instanceof Man) {
this.setMan((Man) person);
} else {
this.setWoman((Woman) person);
}
// 判断条件
if (man == null || woman == null) {
System.out.println("汗,我不是同性恋!");
} else {
if (man.getCondition() == woman.getCondition()) {
System.out.println(man.getName() + "和" + woman.getName() + "绝配");
} else {
System.out.println(man.getName() + "和" + woman.getName()+ "不相配");
}
}
}
}
abstract class Person {
private String name;
private int condition;
private Mediator mediator;
public Person(String name, int condition, Mediator mediator) {
super();
this.name = name;
this.condition = condition;
this.mediator = mediator;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCondition() {
return condition;
}
public void setCondition(int condition) {
this.condition = condition;
}
public abstract void getPartner(Person person);
}
class Man extends Person {
public Man(String name, int condition, Mediator mediator) {
super(name, condition, mediator);
}
public void getPartner(Person person) {
this.getMediator().setMan(this);
this.getMediator().getPartner(person);
}
}
class Woman extends Person {
public Woman(String name, int condition, Mediator mediator) {
super(name, condition, mediator);
}
public void getPartner(Person person) {
this.getMediator().setWoman(this);
this.getMediator().getPartner(person);
}
}
public class Test {
public static void main(String[] args) {
Mediator mediator = new Mediator();
Person zhangsan = new Man("张三", 7, mediator);
Person lisi = new Man("李四", 7, mediator);
Person xiaofang = new Woman("小芳", 7, mediator);
zhangsan.getPartner(xiaofang);
lisi.getPartner(xiaofang);
zhangsan.getPartner(lisi);
/*
* 张三和小芳绝配 李四和小芳绝配 李四和小芳绝配
*/
}
}