定义

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

适用性

  1. 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  2. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  3. 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

结构

中介者模式结构

参与者

中介者模式

  • Mediator(中介者)
    • 中介者定义一个接口用于与各同事(Colleague)对象通信。
  • ConcreteMediator(具体中介者)
    • 具体中介者通过协调各同事对象实现协作行为。
    • 了解并维护它的各个同事。
  • Colleague(同事类)
    • 每一个同事类都知道它的中介者对象。
    • 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。

效果

  1. 减少了子类生成
  2. 它将各Colleague解耦
  3. 它简化了对象协议
  4. 它对对象如何协作进行了抽象
  5. 它使控制集中化

相关模式

  1. Facade与中介者的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即Facade对象对这个子系统类提出请求,但反之则不行。Mediator提供了各Colleague对象不支持或不能支持的协作行为,而且协议是多向的。
  2. Colleague可使用Observer模式与Mediator通信。

示例

  1. abstract class UnitedNations{
  2. public abstract void declare(String message,Country collegue);
  3. }
  4. abstract class Country{
  5. protected UnitedNations mediator;
  6. public Country(UnitedNations mediator){
  7. this.mediator=mediator;
  8. }
  9. }
  10. class USA extends Country{
  11. public USA(UnitedNations mediator) {
  12. super(mediator);
  13. }
  14. public void declare(String message){
  15. mediator.declare(message, this);
  16. }
  17. public void getMessage(String message){
  18. System.out.println("美国接收到:"+message);
  19. }
  20. }
  21. class Iraq extends Country{
  22. public Iraq(UnitedNations mediator) {
  23. super(mediator);
  24. }
  25. public void declare(String message){
  26. mediator.declare(message, this);
  27. }
  28. public void getMessage(String message){
  29. System.out.println("伊拉克接收到:"+message);
  30. }
  31. }
  32. //同事类越多,中介者的逻辑就越复杂
  33. class UnitedNationsSecurityCouncil extends UnitedNations{
  34. private USA usa;
  35. private Iraq iraq;
  36. public USA getUsa() {
  37. return usa;
  38. }
  39. public void setUsa(USA usa) {
  40. this.usa = usa;
  41. }
  42. public Iraq getIraq() {
  43. return iraq;
  44. }
  45. public void setIraq(Iraq iraq) {
  46. this.iraq = iraq;
  47. }
  48. @Override
  49. public void declare(String message, Country collegue) {
  50. //处理通信
  51. if(collegue==usa){
  52. iraq.getMessage(message);
  53. }else{
  54. usa.getMessage(message);
  55. }
  56. }
  57. }
  58. public class Mediator {
  59. //适用于多个对象紧密耦合的情况下(网状结构)->星型结构
  60. public static void main(String[] args) {
  61. UnitedNationsSecurityCouncil unsc=
  62. new UnitedNationsSecurityCouncil();
  63. USA usa=new USA(unsc);
  64. Iraq iraq=new Iraq(unsc);
  65. //同时类必须有中介者,但是中介者却可以只有部分同时类
  66. unsc.setUsa(usa);
  67. unsc.setIraq(iraq);
  68. usa.declare("不准研制核武器!");
  69. iraq.declare("我们不怕国家被侵略!");
  70. }
  71. }