JAVA【设计模式】中介模式
一、定义
中介模式:定义了一个中介对象来封装一系列对象之前的关系,使原有对象之间的耦合松散,且可以独立地改变他们之间的交互,中介者模式又叫做调停模式
中介者一般是多对一,桥接一般是多对多,代理一般是一对一
二、示例:
模拟场景:
1、车辆行驶在交通道路上,交警就相当于一个中介,他负责调停,指导各个车辆的行驶规则。假设没有这个中介(交警),那道路上就是各个车辆相互指挥,最后落得一团糟。
2、年轻的单身伙伴们,需要寻找自己心仪的对象,婚介所就是典型的中介。婚介所里面有很多单身青年的信息,它通过信息比对,做出匹配分析,帮忙介绍对象。假设没有这个中介,那就需要每个人自己去找。
中介者模式设计
单身青年,属性名字,性别,年龄,找到的婚介所。
package com.qf.design.behavior.intermediary.design;
public class Person {
String name;
String sex;
int age;
private MarrageAgency marrageAgency;
public Person(String name, String sex, int age, MarrageAgency marrageAgency) {
this.name = name;
this.sex = sex;
this.age = age;
this.marrageAgency = marrageAgency;
}
public void findFriend(){
marrageAgency.pair(this);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
中介接口
package com.qf.design.behavior.intermediary.design;
public interface MarrageAgency {
void pair(Person person);//匹配会员
void reister(Person person);//注册会员
}
只要性别不同,即可匹配
package com.qf.design.behavior.intermediary.design.impl;
import com.alibaba.fastjson.JSON;
import com.qf.design.behavior.intermediary.design.MarrageAgency;
import com.qf.design.behavior.intermediary.design.Person;
import com.qf.design.behavior.intermediary.tradition.MarrageController;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class MarrageAgencyImpl implements MarrageAgency {
private Logger logger= LoggerFactory.getLogger(MarrageController.class);
private List<Person> personList=new ArrayList<>();
@Override
public void pair(Person person) {
for (Person person1 : personList) {
if (!person.getSex().equals(person1.getSex())){
logger.info("匹配人{}", JSON.toJSONString(person1));
}
}
}
@Override
public void reister(Person person) {
personList.add(person);
}
}
测试:ApiTest
package com.qf.design.behavior.intermediary.design;
import com.qf.design.behavior.intermediary.design.impl.MarrageAgencyImpl;
public class ApiTest {
public static void main(String[] args) {
MarrageAgencyImpl marrageAgency = new MarrageAgencyImpl();
marrageAgency.reister(new Person("张靓颖","女",23,marrageAgency));
marrageAgency.reister(new Person("吴彦祖","男",43,marrageAgency));
marrageAgency.reister(new Person("杨幂","女",24,marrageAgency));
marrageAgency.reister(new Person("汪涵","男",50,marrageAgency));
Person person = new Person("小白白", "男", 18, marrageAgency);
marrageAgency.reister(person);
person.findFriend();
}
}
UML关系图
总结:
以上通过中介者模式的设计思想我们⼿写了⼀个ORM框架,隐去了对数据库操作的复杂度,让外部的调⽤⽅可以⾮常简单的进⾏操作数据库。这也是我们平常使⽤的 Mybatis 的原型,在我们⽇常的开发使⽤中,只需要按照配置即可⾮常简单的操作数据库。
除了以上这种组件模式的开发外,还有服务接⼝的包装也可以使⽤中介者模式来实现。⽐如你们公司有很多的奖品接⼝需要在营销活动中对接,那么可以把这些奖品接⼝统⼀收到中台开发⼀个奖品中⼼,对外提供服务。这样就不需要每⼀个需要对接奖品的接⼝,都去找具体的提供者,⽽是找中台服务即可。
在上述的实现和测试使⽤中可以看到,这种模式的设计满⾜了; 单⼀职责和开闭原则 ,也就符合了迪⽶特原则 ,即越少⼈知道越好。外部的⼈只需要按照需求进⾏调⽤,不需要知道具体的是如何实现的,复杂的⼀⾯已经有组件合作服务平台处理。