美文网首页
第5章 -行为型模式-中介者模式

第5章 -行为型模式-中介者模式

作者: 一介书生独醉江湖 | 来源:发表于2022-07-14 20:25 被阅读0次
行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、中介者模式的简介
■ 用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显式地相互作用;
■ 行为与状态是不应该分割开的;
■ 中介者模式的用途是管理很多的对象的相互作用;
image.png
中介者模式4个角色:
■ 抽象中介者(Mediator)角色:
  该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信;
■ 具体中介者(Concrete Mediator)角色:
  该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为;
■ 抽象同事(Colleague)角色:
  该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象;
■ 具体同事(Concrete Colleague)角色:
  该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的;
/**
 * 抽象中介者
 */
public abstract class Mediator {

    /**
     * 中介者模式的业务逻辑方法
     * @param c
     */
    public abstract void colleagueChanged(Colleague c);
}
/**
 * 具体中介者
 */
public class ConcreteMediator extends Mediator{

    private ConcreteMediator1 c1;

    private ConcreteMediator2 c2;
    /**
     * 中介者模式的业务逻辑方法
     * @param c
     */
    @Override
    public void colleagueChanged(Colleague c) {
        c.action();
    }

    public void createConcreteMediator(){
        c1 = new ConcreteMediator1(this);
        c2 = new ConcreteMediator2(this);
    }

    public ConcreteMediator1 getC1() {
        return c1;
    }

    public ConcreteMediator2 getC2() {
        return c2;
    }
}
/**
 * 抽象同事
 */
public abstract class Colleague {

    private Mediator mediator;

    public Colleague(Mediator m){
        this.mediator = m ;
    }

    public Mediator getMediator() {
        return mediator;
    }

    public void setMediator(Mediator mediator) {
        this.mediator = mediator;
    }

    /**
     * 抽象行动方法,由子类实现
     */
    public abstract void action();

    /**
     * 业务方法,调用此方法改变对象的内部状态
     */
    public void change(){
        this.mediator.colleagueChanged(this);
    }
}
/**
 * 具体同事1
 */
public class ConcreteMediator1 extends Colleague{

    public ConcreteMediator1(Mediator m){
        super(m);
    }

    @Override
    public void action(){
        System.out.println("具体同事1的行动方法");
    }
}
/**
 * 具体同事2
 */
public class ConcreteMediator2 extends Colleague{

    public ConcreteMediator2(Mediator m){
        super(m);
    }

    @Override
    public void action(){
        System.out.println("具体同事2的行动方法");
    }
}

/**
 * 应用代码
 */
public class ClientDemo {

    public static void main(String[] args){
        ConcreteMediator cm = new ConcreteMediator();
        cm.createConcreteMediator();
        ConcreteMediator1 c1 = cm.getC1();
        ConcreteMediator2 c2 = cm.getC2();
        c1.change();
        c2.change();
    }
}
# 控制台输出:
具体同事1的行动方法
具体同事2的行动方法
二、中介者模式的优缺点
中介者模式的优点:
  ■ 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖;
  ■ 避免同事对象之间过度耦合;
  ■ 中介者模式将对象的行为和协作抽象化;
中介者模式的缺点:
  ■ 增加了中介者类的复杂性;
  ■ 中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的;
下列几种情况下,不适合使用中介者模式:
■ 不应当在责任划分混乱时使用;
■ 不应当对数据类和方法类使用;
三、中介者模式的实例
# 使用中介者模式模拟婚姻中介所的工作过程;
image.png
/**
 * 婚姻中介所接口
 */
public interface MarriageAgency {

    /**
     * 为person配对
     * @param person
     */
    void pair(Person person);

    /**
     * 注册会员
     * @param person
     */
    void register(Person person);
}
/**
 * 婚姻中介所实现类
 */
public class MarriageAgencyImpl implements MarriageAgency{

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

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

    @Override
    public void pair(Person person) {
        if(person.sex.equals(Sex.MALE)){
            for(Woman w : women){
                if(w.age == person.requestAge){
                    System.out.println(person.name + " " + w.name + " 匹配成功!");
                    return;
                }
            }
        }else if(person.sex.equals(Sex.FEMALE)){
            for(Man m : men){
                if(m.age == person.requestAge){
                    System.out.println(person.name + " " + m.name + " 匹配成功!");
                    return;
                }
            }
        }
        System.out.println("没有合适的对象");
    }

    @Override
    public void register(Person person) {
        if(person.sex.equals(Sex.MALE)){
            men.add((Man) person);
        }else if(person.sex.equals(Sex.FEMALE)){
            women.add((Woman) person);
        }
    }
}
/**
 * 人的抽象类
 */
public abstract class Person {

    /**
     * 姓名
     */
    String name;

    /**
     * 年龄
     */
    int age;

    /**
     * 性别
     */
    Sex sex;

    /**
     * 期望配偶年龄
     */
    int requestAge;

    /**
     * 婚介
     */
    MarriageAgency marriageAgency;


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

    /**
     * 寻找对象
     */
    public void findPartner(){
        marriageAgency.pair(this);
    }
}
enum Sex{
    MALE , FEMALE
}
/**
 * 男人类
 */
public class Man extends Person{

    public Man(String name, int age, Sex sex, int requestAge, MarriageAgency marriageAgency) {
        super(name, age, sex, requestAge, marriageAgency);
    }

}
/**
 * 女人类
 */
public class Woman extends Person{

    public Woman(String name, int age, Sex sex, int requestAge, MarriageAgency marriageAgency) {
        super(name, age, sex, requestAge, marriageAgency);
    }

}
/**
 * 应用代码
 */
public class ClientDemo {

    public static void main(String[] args){
        MarriageAgency marriageAgency = new MarriageAgencyImpl();

        Person p1 = new Man("张三",23,Sex.MALE,18,marriageAgency);
        Person p2 = new Man("李四",27,Sex.MALE,25,marriageAgency);
        Person p3 = new Woman("王五",25,Sex.FEMALE,27,marriageAgency);
        Person p4 = new Woman("赵四",20,Sex.FEMALE,22,marriageAgency);

        p1.findPartner();
        p2.findPartner();
    }
}
# 控制台输出:
没有合适的对象
李四 王五 匹配成功!
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)

相关文章

网友评论

      本文标题:第5章 -行为型模式-中介者模式

      本文链接:https://www.haomeiwen.com/subject/rnsfirtx.html