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 的原型,在我们⽇常的开发使⽤中,只需要按照配置即可⾮常简单的操作数据库。

除了以上这种组件模式的开发外,还有服务接⼝的包装也可以使⽤中介者模式来实现。⽐如你们公司有很多的奖品接⼝需要在营销活动中对接,那么可以把这些奖品接⼝统⼀收到中台开发⼀个奖品中⼼,对外提供服务。这样就不需要每⼀个需要对接奖品的接⼝,都去找具体的提供者,⽽是找中台服务即可。

在上述的实现和测试使⽤中可以看到,这种模式的设计满⾜了; 单⼀职责和开闭原则 ,也就符合了迪⽶特原则 ,即越少⼈知道越好。外部的⼈只需要按照需求进⾏调⽤,不需要知道具体的是如何实现的,复杂的⼀⾯已经有组件合作服务平台处理。

posted @ 2022-08-30 22:40  雾托邦  阅读(69)  评论(0编辑  收藏  举报