美文网首页
设计模式-中介者模式(行为型)

设计模式-中介者模式(行为型)

作者: NealLemon | 来源:发表于2019-08-27 21:46 被阅读0次

定义

  • 定义了<u>一个封装一组对象</u>交互的<u>对象</u>。
  • 通过使对象明确的相互引用来促进松散耦合,并允许独立的改变他们的交互。

适用场景

  • 系统中的对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
  • 交互的公共行为,如果需要改变行为则可以增加新的中介者类。

缺点

  • 导致系统复杂。

代码

我们小时候在班级上,都有课代表,比如数学课代表,当数学老师下课时,可能忘留作业了,那么他就会叫班长去办公室,告诉他数学作业,让他将作业转达给所有同学。

进行抽象

  • 老师
  • 班长(中介者)

老师抽象类(Teacher)

/**
 * 老师
 */
public abstract class Teacher {

    private String name;

    public Teacher(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void homework(String homework, StudentMediator studentMediator);
}

数学和语文老师具体实现类

public class MathTeacher extends Teacher {

    public MathTeacher(String name) {
        super(name);
    }

    @Override
    public void homework(String homework, StudentMediator studentMediator) {
        studentMediator.conveyHomework(this,homework);
    }
}
public class EnglishTeacher extends Teacher {

    public EnglishTeacher(String name) {
        super(name);
    }

    @Override
    public void homework(String homework, StudentMediator studentMediator) {
        studentMediator.conveyHomework(this,homework);
    }
}

班干部抽象类

/**
 * 班干部
 */
public abstract class StudentMediator {


    public abstract void conveyHomework(Teacher teacher,String homework);


}

班长具体实现类

/**
 * 班长
 */
public class Monitor extends StudentMediator {

    @Override
    public void conveyHomework(Teacher teacher,String homework) {
        System.out.println(teacher.getName()+ "布置作业:" + homework);
    }
}

UML类图

studentUML.jpg

我们可以清晰的看出 中介(学生干部) 传达任何老师布置的内容。

测试代码

public class Test {

    public static void main(String[] args) {
        Teacher englishTeacher = new EnglishTeacher("英语老师");
        Teacher mathTeacher = new MathTeacher("数学老师");
        StudentMediator mediator = new Monitor();
        mathTeacher.homework("背诵唐诗300首",mediator);
        englishTeacher.homework("试卷2套",mediator);
    }
}

结果

数学老师布置作业:背诵唐诗300首
英语老师布置作业:试卷2套

改变场景

班长突然跟语文老师闹矛盾,不帮助语文老师布置作业,我们可以修改 Monitor

/**
 * 班长
 */
public class Monitor extends StudentMediator {

    @Override
    public void conveyHomework(Teacher teacher,String homework) {
        if("语文老师".equals(teacher.getName())) {
            System.out.println("自己去教室布置作业");
        }else{
            System.out.println(teacher.getName()+ "布置作业:" + homework);
        }
    }
}

这样我们就实现了独立改变一组对象中的某一些交互实现。

小结

在学习中介者模式的时候,觉得会跟 其他模式弄混淆,比如外观模式,针对这种模式,还是需要在具体的业务之中探索。

相关文章

网友评论

      本文标题:设计模式-中介者模式(行为型)

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