中介者模式

1. 什么是中介者模式

Mediator 模式也叫中介者模式,是由 GOF 提出的 23 种软件设计模式的一种。 Mediator 模式是行为模式之一。在 Mediator 模式中,类之间的交互行为被统一放在 Mediator 的对象中,对象通过 Mediator 对象同其他对象交互, Mediator 对象起着控制器的作用。

2. 中介者模式的结构

18_中介者模式 - 图1

3. 中介者模式的角色和职责

  • mediator 中介者类的抽象父类。
  • concreteMediator 具体的中介者类。
  • colleague 关联类的抽象父类。
  • concreteColleague 具体的关联类。

4. 中介者模式的优点

  1. 将系统按功能分割成更小的对象,符合类的最小设计原则。
  2. 对关联对象的集中控制。
  3. 减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则,而 Mediator 模式将原来相互依存的多对多的类之间的关系简化为 Mediator 控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在 Mediator 控制类)。
  4. 有利于提高类的重用性

5. 代码演示

5.1. 不使用中介者

  1. public abstract class Person {
  2. private String name;
  3. private int condition;
  4. public Person(String name, int condition) {
  5. this.name = name;
  6. this.condition = condition;
  7. }
  8. public String getName() {
  9. return name;
  10. }
  11. public void setName(String name) {
  12. this.name = name;
  13. }
  14. public int getCondition() {
  15. return condition;
  16. }
  17. public void setCondition(int condition) {
  18. this.condition = condition;
  19. }
  20. public abstract void getPartner(Person person);
  21. }
  1. public class Man extends Person {
  2. public Man(String name, int condition) {
  3. super(name, condition);
  4. }
  5. @Override
  6. public void getPartner(Person person) {
  7. if (person instanceof Man) {
  8. System.out.println("汗,我不是同性恋!");
  9. } else {
  10. if (this.getCondition() == person.getCondition()) {
  11. System.out.println(this.getName() + "和" + person.getName() + "绝配");
  12. } else {
  13. System.out.println(this.getName() + "和" + person.getName() + "不相配");
  14. }
  15. }
  16. }
  17. }
  1. public class Woman extends Person {
  2. public Woman(String name, int condition) {
  3. super(name, condition);
  4. }
  5. @Override
  6. public void getPartner(Person person) {
  7. if (person instanceof Man) {
  8. System.out.println("汗,我不是同性恋!");
  9. } else {
  10. if (this.getCondition() == person.getCondition()) {
  11. System.out.println(this.getName() + "和" + person.getName() + "绝配");
  12. } else {
  13. System.out.println(this.getName() + "和" + person.getName() + "不相配");
  14. }
  15. }
  16. }
  17. }
  1. Person zhangsan = new Man("张三", 5);
  2. Person lisi = new Man("李四", 6);
  3. Person xiaofang = new Woman("小芳", 6);
  4. zhangsan.getPartner(xiaofang);
  5. lisi.getPartner(xiaofang);
  6. zhangsan.getPartner(lisi);
  1. 张三和小芳不相配
  2. 李四和小芳绝配
  3. 汗,我不是同性恋!

5.2. 使用中介者

  1. public abstract class Person {
  2. private String name;
  3. private int condition;
  4. private Mediator mediator;
  5. public Person(String name, int condition, Mediator mediator) {
  6. this.name = name;
  7. this.condition = condition;
  8. this.mediator = mediator;
  9. }
  10. public String getName() {
  11. return name;
  12. }
  13. public void setName(String name) {
  14. this.name = name;
  15. }
  16. public int getCondition() {
  17. return condition;
  18. }
  19. public void setCondition(int condition) {
  20. this.condition = condition;
  21. }
  22. public Mediator getMediator() {
  23. return mediator;
  24. }
  25. public void setMediator(Mediator mediator) {
  26. this.mediator = mediator;
  27. }
  28. public abstract void getPartner(Person person);
  29. }
  1. public class Mediator {
  2. private Man man;
  3. private Woman woman;
  4. public void setMan(Man man) {
  5. this.man = man;
  6. }
  7. public void setWoman(Woman woman) {
  8. this.woman = woman;
  9. }
  10. public void getPartner(Person person) {
  11. if (person instanceof Man) {
  12. this.setMan((Man) person);
  13. } else {
  14. this.setWoman((Woman) person);
  15. }
  16. if (man == null || woman == null) {
  17. System.out.println("汗,我不是同性恋!");
  18. } else {
  19. if (man.getCondition() == woman.getCondition()) {
  20. System.out.println(man.getName() + "和" + woman.getName() + "绝配");
  21. } else {
  22. System.out.println(man.getName() + "和" + woman.getName() + "不相配");
  23. }
  24. }
  25. }
  26. }
  1. public class Man extends Person {
  2. public Man(String name, int condition, Mediator mediator) {
  3. super(name, condition, mediator);
  4. }
  5. @Override
  6. public void getPartner(Person person) {
  7. this.getMediator().setMan(this);
  8. this.getMediator().setWoman(null);
  9. this.getMediator().getPartner(person);
  10. }
  11. }
  1. public class Woman extends Person {
  2. public Woman(String name, int condition, Mediator mediator) {
  3. super(name, condition, mediator);
  4. }
  5. @Override
  6. public void getPartner(Person person) {
  7. this.getMediator().setWoman(this);
  8. this.getMediator().setMan(null);
  9. this.getMediator().getPartner(person);
  10. }
  11. }
  1. Mediator mediator = new Mediator();
  2. Person zhangsan = new Man("张三", 5, mediator);
  3. Person lisi = new Man("李四", 6, mediator);
  4. Person xiaofang = new Woman("小芳", 6, mediator);
  5. zhangsan.getPartner(xiaofang);
  6. lisi.getPartner(xiaofang);
  7. zhangsan.getPartner(lisi);
  1. 张三和小芳不相配
  2. 李四和小芳绝配
  3. 汗,我不是同性恋!