中介者維護一組用户的交互,用户之間通過中介者進行交互,而不是直接交互。
中介者模式種一般有以下角色
- 抽象中介者:定義中介者需要的執行方法。
- 具體中介者:實現用户交互的具體邏輯。
- 用户類:引入中介者,向中介者輸出需要交互的內容。
下面通過一個婚介中心的實例來實現中介者模式
抽象中介者 - 婚介中心
public interface DatingAgency {
/**
* 加入會員
* @param dog
*/
void join(SingleDog dog);
/**
* 根據年齡範圍選會員
* @param min
* @param max
* @return
*/
List<SingleDog> getList(Integer min, Integer max, SingleDog.SexEnum sexEnum);
}
具體中介者 - 王婆婚介所
public class WangPoDatingAgency implements DatingAgency{
private List<SingleDog> singleDogs = new ArrayList<>();
@Override
public void join(SingleDog dog) {
System.out.println("歡迎"+dog.getName()+"加入王婆婚介所");
singleDogs.add(dog);
}
@Override
public List<SingleDog> 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<SingleDog> 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<SingleDog> 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<SingleDog> 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<SingleDog> 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
你是我的心你是我的肝你是我的四分之三!
優點
- 降低了類的複雜度,將原本用户之間的一對多,變成了用户和中介之間的一對一
- 將用户之間解耦
缺點
- 中介者會非常龐大,難以維護