中介者模式(行为型)

中介者模式:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互.

按照我的理解:
中介者模式类似婚姻介绍所,想象自己去婚姻中介所的过程:

  1. 我们要去婚姻中介所找对象时,首先要将自己的信息登记到婚姻中介所,然后由中介所帮我们按照条件找匹配对象,应该不会自己去找匹配对象吧,(所以就符合中介者模式定义中的:各对象不需要显式地相互作用,从而使其耦合松散);
  2. 我们登记信息之后可以等待另一半找自己,也可以自己要求中介所帮我找.

下面是婚姻中介所的类图:
画的有点复杂,其实就是MarriageAgencyImpl类和Man类和Woman类三个的关系,MarriageAgencyImpl婚姻中介所登记了1~n个man或woman,然后每个登记在册的男女都可以调用findpartner()方法尝试找另一半.
这里写图片描述


贴一下代码:
Test测试类(可以看出每个人之间是不直接交互的,全部由中介所搞定):

package com.shusheng.pattern.mediator;
public class Test {
    public static void main(String[] args) {
        MarriageAgency agency = new MarriageAgencyImpl();//婚姻中介所
        Person m1 = new Man("jone", 20, 18, agency);//登记人以及所需对象的年龄
        Person m2 = new Man("mike", 27, 25, agency);
        new Woman("mary", 25, 27, agency);
        new Woman("jane", 20, 22, agency);
        m1.findPartner();//调用找另一半的方法
        m2.findPartner();
    }
}

Man类(只有简单构造函数):

package com.shusheng.pattern.mediator;
public class Man extends Person{
    public Man(String name, int age, int requestAge, MarriageAgency agency) {
        super(name, age, Sex.MALE, requestAge, agency);
    }
}

Woman类(只有简单构造函数):

package com.shusheng.pattern.mediator;
public class Woman extends Person{
    public Woman(String name, int age, int requestAge, MarriageAgency agency) {
        super(name, age, Sex.FEMALE, requestAge, agency);
    }
}
package com.shusheng.pattern.mediator;
public abstract class Person {
    String name;//姓名
    int age;//年龄
    Sex sex;//性别
    int requestAge;//要求对象的年龄,对对象只有这一个要求
    MarriageAgency agency;//婚姻中介

    public Person(String name,int age,Sex sex,int requestAge,MarriageAgency agency) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.requestAge = requestAge;
        this.agency = agency;
        agency.register(this);//注册会员
    }

    //寻找对象
    public void findPartner() {
        this.agency.pair(this);//委托中介所帮忙找
    }

    //性别
    enum Sex {
        MALE,FEMALE;
    }
}

MarriageAgency中介所类(只干两件事:登记会员 和 配对):

package com.shusheng.pattern.mediator;
public interface MarriageAgency {
    public void pair(Person person);//为person配对
    public void register(Person person);//注册会员
}

MarriageAgencyImpl中介所的实现类:

package com.shusheng.pattern.mediator;
import java.util.ArrayList;
import java.util.List;
import com.shusheng.pattern.mediator.Person.Sex;

public class MarriageAgencyImpl implements MarriageAgency {

    List<Man> men = new ArrayList<>();
    List<Woman> women = new ArrayList<>();

    @Override
    public void pair(Person person) {//配对
        if (person.sex == Sex.MALE) {
            for (Woman woman : women)
                if (woman.age == person.requestAge) {
                    System.out.println(person.name + "和" + woman.name + "配对成功");
                    return;
                }
        } else if (person.sex == Sex.FEMALE) {
            for (Man man : men) {
                if (man.age == person.requestAge) {
                    System.out.println(person.name + "和" + man.name + "配对成功");
                    return;
                }
            }
        }
        System.out.println("没有为"+person.name+"找到合适的对象");
    }


    @Override
    public void register(Person person) {
        if (person.sex == Sex.MALE)
            men.add((Man) person);
        else if (person.sex == Sex.FEMALE)
            women.add((Woman) person);
    }
}

运行结果:
这里写图片描述

简单总结:中介者模式跟婚姻中介所很像,我们去登记之后,配对的事情交给中介所处理.会员之间不直接交互.顺利实现解耦.


中介者模式优点:
1. 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,(因为没有中介者,我们必须自己保存每个妹纸/帅哥的信息,并自己匹配,是一对多关系,现在我们只需要保存中介者对象引用就可以了,成为一对一关系),使得对象之间的关系更容易维护和理解.

  1. 避免会员对象之间过度耦合,会员类只依赖与中介者,使会员类更易被复用(不会出现自己匹配对象的代码),中介类和会员类可以相对独立地演化.

  2. 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理.


中介者模式的缺点:
1. 中介者模式降低了会员对象的复杂性,但增加了中介者类的复杂性(因为匹配代码迁到中介者类了).
2. 中介者类经常充满了各个具体会员类的关系协调代码,这些代码时不能复用的.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值