中介者模式:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互.
按照我的理解:
中介者模式类似婚姻介绍所,想象自己去婚姻中介所的过程:
- 我们要去婚姻中介所找对象时,首先要将自己的信息登记到婚姻中介所,然后由中介所帮我们按照条件找匹配对象,应该不会自己去找匹配对象吧,(所以就符合中介者模式定义中的:各对象不需要显式地相互作用,从而使其耦合松散);
- 我们登记信息之后可以等待另一半找自己,也可以自己要求中介所帮我找.
下面是婚姻中介所的类图:
画的有点复杂,其实就是MarriageAgencyImpl类和Man类和Woman类三个的关系,MarriageAgencyImpl婚姻中介所登记了1~n个man或woman,然后每个登记在册的男女都可以调用findpartner()方法尝试找另一半.
贴一下代码:
Test测试类(可以看出每个人之间是不直接交互的,全部由中介所搞定):
package com.shusheng.pattern.mediator;
public class Test {
public static void main(String[] args) {
MarriageAgency agency = new MarriageAgencyImpl();//婚姻中介所
Person m1 = new Man("jone", 20, 18, agency);//登记人以及所需对象的年龄
Person m2 = new Man("mike", 27, 25, agency);
new Woman("mary", 25, 27, agency);
new Woman("jane", 20, 22, agency);
m1.findPartner();//调用找另一半的方法
m2.findPartner();
}
}
Man类(只有简单构造函数):
package com.shusheng.pattern.mediator;
public class Man extends Person{
public Man(String name, int age, int requestAge, MarriageAgency agency) {
super(name, age, Sex.MALE, requestAge, agency);
}
}
Woman类(只有简单构造函数):
package com.shusheng.pattern.mediator;
public class Woman extends Person{
public Woman(String name, int age, int requestAge, MarriageAgency agency) {
super(name, age, Sex.FEMALE, requestAge, agency);
}
}
package com.shusheng.pattern.mediator;
public abstract class Person {
String name;//姓名
int age;//年龄
Sex sex;//性别
int requestAge;//要求对象的年龄,对对象只有这一个要求
MarriageAgency agency;//婚姻中介
public Person(String name,int age,Sex sex,int requestAge,MarriageAgency agency) {
this.name = name;
this.age = age;
this.sex = sex;
this.requestAge = requestAge;
this.agency = agency;
agency.register(this);//注册会员
}
//寻找对象
public void findPartner() {
this.agency.pair(this);//委托中介所帮忙找
}
//性别
enum Sex {
MALE,FEMALE;
}
}
MarriageAgency中介所类(只干两件事:登记会员 和 配对):
package com.shusheng.pattern.mediator;
public interface MarriageAgency {
public void pair(Person person);//为person配对
public void register(Person person);//注册会员
}
MarriageAgencyImpl中介所的实现类:
package com.shusheng.pattern.mediator;
import java.util.ArrayList;
import java.util.List;
import com.shusheng.pattern.mediator.Person.Sex;
public class MarriageAgencyImpl implements MarriageAgency {
List<Man> men = new ArrayList<>();
List<Woman> women = new ArrayList<>();
@Override
public void pair(Person person) {//配对
if (person.sex == Sex.MALE) {
for (Woman woman : women)
if (woman.age == person.requestAge) {
System.out.println(person.name + "和" + woman.name + "配对成功");
return;
}
} else if (person.sex == Sex.FEMALE) {
for (Man man : men) {
if (man.age == person.requestAge) {
System.out.println(person.name + "和" + man.name + "配对成功");
return;
}
}
}
System.out.println("没有为"+person.name+"找到合适的对象");
}
@Override
public void register(Person person) {
if (person.sex == Sex.MALE)
men.add((Man) person);
else if (person.sex == Sex.FEMALE)
women.add((Woman) person);
}
}
运行结果:
简单总结:中介者模式跟婚姻中介所很像,我们去登记之后,配对的事情交给中介所处理.会员之间不直接交互.顺利实现解耦.
中介者模式优点:
1. 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,(因为没有中介者,我们必须自己保存每个妹纸/帅哥的信息,并自己匹配,是一对多关系,现在我们只需要保存中介者对象引用就可以了,成为一对一关系),使得对象之间的关系更容易维护和理解.
避免会员对象之间过度耦合,会员类只依赖与中介者,使会员类更易被复用(不会出现自己匹配对象的代码),中介类和会员类可以相对独立地演化.
中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理.
中介者模式的缺点:
1. 中介者模式降低了会员对象的复杂性,但增加了中介者类的复杂性(因为匹配代码迁到中介者类了).
2. 中介者类经常充满了各个具体会员类的关系协调代码,这些代码时不能复用的.