中介者模式

一、中介者模式的介绍

1、定义

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

       中介者模式的角色划分:

  • 抽象中介者角色(Mediator):该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信。
  • 具体中介者角色(ConcreteMediator):该角色实现抽象中介者,它依赖于各同事角色,并通过协调各同事角色实现协作行为。
  • 抽象同事角色(Colleague):该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象。
  • 具体同事角色(ConcreteColleague):该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围的目的。

       中介者模式的类图如下:

2、使用场景

  • 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

3、优缺点

(1)优点

  • 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,是的对象之间的关系更易维护和理解。
  • 避免同事之间过度耦合,同事类只依赖于中介者,使同事类更易被复用,中介类和同事类可以相对独立地演化。
  • 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。

(2)缺点

  • 中介者模式降低了同事对象的复杂性,但增加了中介者类的复杂性。
  • 中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的。

二、中介者模式的实现

       场景描述:过年回家,你又被悲催地催婚了,父母带你去了婚姻中介所……

       类图如下:

       实现如下:

/**
 * 婚姻中介所:抽象中介者角色
 */
public interface MarriageAgency {
    /**
     * 为Person配对
     * @param person
     */
    void pair(Person person);

    /**
     * 注册为会员
     * @param person
     */
    void register(Person person);

}
/**
 * 具体中介者角色
 */
public class MarriageAgencyImp implements MarriageAgency{
    //男会员列表
    List<Man> men = new ArrayList<>();
    //女会员列表
    List<Woman> women = new ArrayList<>();

    /**
     * 根据条件找对象
     * @param person
     */
    @Override
    public void pair(Person person) {
        //如果是男的,在女会员列表中找合适的,反之则在男会员列表中找
        if("男".equals(person.sex)){
            for(Woman w : women){
                if(w.age == person.requeireAge){
                    System.out.println(person.name + "和" +  w.name + "终成眷属");
                    return;
                }
            }
        }else if("女".equals(person.sex)){
            for(Man m : men){
                if(m.age == person.requeireAge){
                    System.out.println(person.name + "和" +  m.name + "终成眷属");
                    return;
                }
            }
        }
        System.out.println("目前找不到合适的对象");
    }

    /**
     * 注册会员
     * @param person
     */
    @Override
    public void register(Person person) {
        if("男".equals(person.sex)){
            men.add((Man) person);
        }else if("女".equals(person.sex)){
            women.add((Woman) person);
        }
    }

}
/**
 * 抽象同事角色
 */
public abstract class Person {
    //姓名
    String name;
    //年龄
    int age;
    //性别
    String sex;//要求的年龄
    int requeireAge;
    MarriageAgency marriageAgency;

    public Person(String name, int age, String sex, int requeireAge, MarriageAgency marriageAgency) {
        this.name = name;
        this.age = age;
        this.sex = sex;
        this.requeireAge = requeireAge;
        this.marriageAgency = marriageAgency;
        marriageAgency.register(this);
    }

    /**
     * 找对象
     */
    public void findPartner(){
        marriageAgency.pair(this);
    }

}
/**
 * 具体同事角色
 */
public class Man extends Person{
    public Man(String name, int age, String sex, int requeireAge, MarriageAgency marriageAgency) {
        super(name, age, sex, requeireAge, marriageAgency);
    }
}
/**
 * 具体同事角色
 */
public class Woman extends Person{
    public Woman(String name, int age, String sex, int requeireAge, MarriageAgency marriageAgency) {
        super(name, age, sex, requeireAge, marriageAgency);
    }
}
public class Client {
    public static void main(String[] args) {
        MarriageAgency marriageAgency = new MarriageAgencyImp();
        Person man1 = new Man("张强", 24, "男", 22, marriageAgency);
        Person man2 = new Man("康欣", 27, "男", 20, marriageAgency);
        Person woman1 = new Woman("王慧", 22, "女", 24, marriageAgency);
        Person woman2 = new Woman("李静", 23, "女", 26, marriageAgency);
        Person woman3 = new Woman("赵蕊", 24, "女", 24, marriageAgency);
        man1.findPartner();
        man2.findPartner();
    }
}

       执行结果如下:

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页