中介者维护一组用户的交互,用户之间通过中介者进行交互,而不是直接交互。
中介者模式种一般有以下角色
- 抽象中介者:定义中介者需要的执行方法。
- 具体中介者:实现用户交互的具体逻辑。
- 用户类:引入中介者,向中介者输出需要交互的内容。
下面通过一个婚介中心的实例来实现中介者模式
抽象中介者 - 婚介中心
public interface DatingAgency {
/**
* 加入会员
* @param dog
*/
void join(SingleDog dog);
/**
* 根据年龄范围选会员
* @param min
* @param max
* @return
*/
List getList(Integer min, Integer max, SingleDog.SexEnum sexEnum);
}
具体中介者 - 王婆婚介所
public class WangPoDatingAgency implements DatingAgency{
private List singleDogs = new ArrayList<>();
@Override
public void join(SingleDog dog) {
System.out.println("欢迎"+dog.getName()+"加入王婆婚介所");
singleDogs.add(dog);
}
@Override
public List getList(Integer min, Integer max, SingleDog.SexEnum sexEnum) {
return singleDogs.stream().filter(dog -> {
if (dog.getAge() >= min && dog.getAge() <= max && !sexEnum.equals(dog.getSex())) return true;
return false;
}).collect(Collectors.toList());
}
}
抽象用户 - 单身人员
public abstract class SingleDog {
DatingAgency agency;
private String name;
private Integer age;
private SexEnum sex;
public enum SexEnum{
MAN("男"),WOMAN("女");
private String sex;
SexEnum(String sex) {
this.sex = sex;
}
}
public SingleDog(DatingAgency agency, String name, Integer age, SexEnum sex) {
this.agency = agency;
this.name = name;
this.age = age;
this.sex = sex;
agency.join(this);
}
/**
* 根据年龄挑选异性
* @return
*/
public abstract List pickByAge(Integer min,Integer max);
public abstract void introduce();
public DatingAgency getAgency() {
return agency;
}
public void setAgency(DatingAgency agency) {
this.agency = agency;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public SexEnum getSex() {
return sex;
}
}
具体用户 - 程序员用户
public class Programmer extends SingleDog{
public Programmer(DatingAgency agency, String name, Integer age, SexEnum sex) {
super(agency, name, age, sex);
}
@Override
public List pickByAge(Integer min, Integer max) {
return agency.getList(min,max,getSex());
}
@Override
public void introduce() {
System.out.println("读以下代码可以获取我的QQ号");
System.out.println("0110 1001 0101 0001 0010 0011 0100 ......");
}
}
具体用户 - 恋爱经验丰富的单身人员
public class ExperienceSingleDog extends SingleDog{
public ExperienceSingleDog(DatingAgency agency, String name, Integer age, SexEnum sex) {
super(agency, name, age, sex);
}
@Override
public List pickByAge(Integer min, Integer max) {
return agency.getList(min,max,getSex());
}
@Override
public void introduce() {
System.out.println("你是我的心你是我的肝你是我的四分之三!");
}
}
测试
public class MediatorTest {
@Test
public void test(){
DatingAgency agency = new WangPoDatingAgency();
SingleDog dog1 = new Programmer(agency,"程序员A",23, SingleDog.SexEnum.MAN);
SingleDog dog2 = new Programmer(agency,"程序员B",29, SingleDog.SexEnum.MAN);
SingleDog dog3 = new Programmer(agency,"程序员C",35, SingleDog.SexEnum.WOMAN);
SingleDog dog4 = new ExperienceSingleDog(agency,"渣男A",24, SingleDog.SexEnum.MAN);
SingleDog dog5 = new ExperienceSingleDog(agency,"渣女A",31, SingleDog.SexEnum.WOMAN);
List singleDogs = dog5.pickByAge(24, 35);
for (SingleDog dog:singleDogs) {
System.out.println("====================");
System.out.println("名字"+dog.getName());
System.out.println("年龄"+dog.getAge());
dog.introduce();
}
}
}
======结果======
欢迎程序员A加入王婆婚介所
欢迎程序员B加入王婆婚介所
欢迎程序员C加入王婆婚介所
欢迎渣男A加入王婆婚介所
欢迎渣女A加入王婆婚介所
====================
名字程序员B
年龄29
读以下代码可以获取我的QQ号
0110 1001 0101 0001 0010 0011 0100 ......
====================
名字渣男A
年龄24
你是我的心你是我的肝你是我的四分之三!
优点
- 降低了类的复杂度,将原本用户之间的一对多,变成了用户和中介之间的一对一
- 将用户之间解耦
缺点
- 中介者会非常庞大,难以维护