定义:
也称为调停者模式,用一个中介对象封装一系列对象的交互,中介者对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
角色:
- 抽象中介者:定义出同事对象到中介者对象的统一接口,用于各同事角色对象的通信
- 具体中介者:实现抽象中介者,依赖于各个同事角色,通过协调各同事角色实现协作行为
- 抽象同事:定义出中介者到同事对象的接口,同事对象只知道中介者而不清楚其余同事对象
- 具体同事:实现抽象同事类,每一个具体同事都清除在自己小范围内的行为,而不知道大范围的目的
优点:
- 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易维护和理解
- 避免同事对象之间过度耦合,同事类只依赖于中介者,使同事类更易被复用,中介类和同事类可以相对独立的演化
- 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理
缺点:
- 增加了中介者的复杂性
- 协调代码不可以复用
注意:
- 不应当在职责划分混乱时使用
- 不应当对数据类和方法类使用
- 正确理解封装,封装首先是行为,其次是状态,俩者不应该分隔开,
- 管理很多对象的相互作用,以便这些对象可以专注于自己的行为
实例: 婚介
package 中介者模式;
public interface MarriageAgency {
public void pair(Person person);
public void register(Person person);
}
package 中介者模式;
import java.util.ArrayList;
import 中介者模式.Person.Sex;
public class Mapping implements MarriageAgency{
ArrayList<Man> man = new ArrayList<>();
ArrayList<Woman> woman = new ArrayList<>();
@Override
public void pair(Person person) {
// TODO 自动生成的方法存根
//System.out.println("开始匹配");
if(person.sex == Sex.FEMALE){ //女
for(Man m:man){
if(m.age == person.requestAge){
System.out.println(person.name+"匹配成功 与"+m.name);
return ;
}
}
}else{
for(Woman m:woman){
if(m.age == person.requestAge){
System.out.println(person.name+"匹配成功 与"+m.name);
return ;
}
}
}
}
@Override
public void register(Person person) {
// TODO 自动生成的方法存根
if(person.sex == Sex.FEMALE){ //女
woman.add((Woman) person);
}else{
man.add((Man) person);
}
}
}
package 中介者模式;
public abstract class Person {
public String name;
public int age;
public Sex sex;
public int requestAge;
MarriageAgency agency;
public Person(String name,int age,Sex sex,int requestAge,MarriageAgency agency) {
// TODO 自动生成的构造函数存根
this.name = name;
this.age =age;
this.sex = sex;
this.requestAge = requestAge;
this.agency = agency;
this.agency.register(this);
}
public void find() {
this.agency.pair(this);
}
enum Sex{
MALE,FEMALE;
}
}
package 中介者模式;
public class Man extends Person{
public Man(String name, int age, int requestAge,
MarriageAgency agency) {
super(name, age,Sex.MALE, requestAge, agency);
// TODO 自动生成的构造函数存根
}
}
package 中介者模式;
public class Woman extends Person{
public Woman(String name, int age, int requestAge,
MarriageAgency agency) {
super(name, age,Sex.FEMALE, requestAge, agency);
// TODO 自动生成的构造函数存根
}
}
package 中介者模式;
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
MarriageAgency marriageAgency = new Mapping();
Person p1 = new Man("小明", 18, 18, marriageAgency);
Person p2 = new Man("小强", 19, 20, marriageAgency);
Person p3 = new Man("小胖", 20, 19, marriageAgency);
Person b1 = new Woman("小兰", 18, 18, marriageAgency);
Person b2 = new Woman("小花", 19, 20, marriageAgency);
Person b3 = new Woman("小琴", 20, 19, marriageAgency);
p1.find();
p2.find();
p3.find();
System.out.println();
b1.find();
b2.find();
b3.find();
}
}
小明匹配成功 与小兰
小强匹配成功 与小琴
小胖匹配成功 与小花小兰匹配成功 与小明
小花匹配成功 与小胖
小琴匹配成功 与小强