头图

中介者维护一组用户的交互,用户之间通过中介者进行交互,而不是直接交互。

中介者模式种一般有以下角色

  • 抽象中介者:定义中介者需要的执行方法。
  • 具体中介者:实现用户交互的具体逻辑。
  • 用户类:引入中介者,向中介者输出需要交互的内容。

下面通过一个婚介中心的实例来实现中介者模式

抽象中介者 - 婚介中心

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
你是我的心你是我的肝你是我的四分之三!

优点

  • 降低了类的复杂度,将原本用户之间的一对多,变成了用户和中介之间的一对一
  • 将用户之间解耦

缺点

  • 中介者会非常庞大,难以维护

eacape
205 声望8 粉丝

JAVA 攻城狮


« 上一篇
备忘录模式
下一篇 »
命令模式