中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护
 
Class Diagram 
Implementation 
封装消息类型 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public  class  Message           String from;          String content;          String to;          String type;     public  Message (String type)           this .type = type;     }     public  Message setFrom (String from)          this .from = from;         return  this ;     }     public  Message setContent (String content)           this .content = content;         return  this ;     }     public  Message setTo (String to)          this .to = to;         return  this ;     }     public  String getFrom ()           return  from;     }     public  String getContent ()           return  content;     }     public  String getTo ()           return  to;     }     public  String getType ()          return  type;     } } 
中介者抽象类 
1 2 3 4 5 6 7 abstract  class  Mediator      public  abstract  void  processMessage (Message message)      public  abstract  void  addUser (User user)      public  abstract  void  addFileServer (FileServer fileServer)  } 
用户类 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 public  class  User           private  String name;          private  List<String> messageList = new  ArrayList<>();          private  Mediator mediator;     public  User (Mediator mediator)           this .mediator = mediator;         this .mediator.addUser(this );     }     public  String getName ()           return  name;     }     public  void  setName (String name)           this .name = name;     }          public  void  pushMessage (String content, String to)           content = content + "\t\t"  + LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-MM-dd hh:mm:ss" ));         this .messageList.add("me :"  + content);         Message message = new  Message("msg" ).setContent(content).setFrom(getName()).setTo(to);         this .mediator.processMessage(message);     }          public  void  uploadFile (String content)          Message message = new  Message("file" ).setFrom(getName()).setContent("U" +content);         this .mediator.processMessage(message);     }          public  void  downloadFile (String content)          this .messageList.add("申请下载《" +content+"》,请求文件服务器中..." );         Message message = new  Message("file" ).setFrom(getName()).setContent("D" +content);         this .mediator.processMessage(message);     }          protected  void  putMessage (String content)           this .messageList.add(content);     }          public  void  showMessages ()           System.out.println("\n======== "  + getName() + "'s messageBox begin ========" );         messageList.forEach(System.out::println);         System.out.println("======== "  + getName() + "'s messageBox  end  ========\n" );     } } 
文件服务器类 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 public  class  FileServer      List<String> fileList = new  ArrayList<>();     private  Mediator mediator;     public  FileServer (Mediator mediator)           this .mediator = mediator;         this .mediator.addFileServer(this );     }     private  boolean  isFound;     public  void  upload (String fileName, String userName)           String returnContent;         if  (!fileList.contains(fileName)) {             fileList.add(fileName);             returnContent = "文件上传成功" ;         } else  {             returnContent = "文件已经存在" ;         }         Message message = new  Message("msg" ).setFrom("FileServer" ).setContent(returnContent).setTo(userName);         mediator.processMessage(message);     }     public  void  download (String fileName, String userName)           String returnContent;         isFound = false ;         fileList.forEach((String file) -> {             if  (file.equalsIgnoreCase(fileName)) {                 isFound = true ;             }         });         if  (isFound) {             returnContent = "["  + fileName + "]传输中..." ;         } else  {             returnContent = "下载失败,["  + fileName + "]不存在" ;         }         Message message = new  Message("msg" ).setFrom("FileServer" ).setContent(returnContent).setTo(userName);         mediator.processMessage(message);     }          public  void  showFileList ()           fileList.forEach(System.out::println);     } } 
中介者实现类 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 public  class  ConcreteMediator  extends  Mediator      List<User> userList = new  ArrayList<>();     List<FileServer> fileServerList = new  ArrayList<>();     public  ConcreteMediator ()       }     @Override      public  void  processMessage (Message message)           String messageType = message.getType();         String content = message.getContent();         String from = message.getFrom();         String to = message.getTo();         switch  (messageType) {             case  "file" :                 fileServerList.forEach((FileServer server) -> {                     if  (content.startsWith("U" )) {                         String fileName = content.substring(1 );                         server.upload(fileName, from);                     } else  if  (content.startsWith("D" )) {                         String fileName = content.substring(1 );                         server.download(fileName, from);                     } else  {                         this .processMessage(new  Message("msg" ).setContent("请求内容错误" ).setTo(from).setFrom("系统" ));                     }                 });                 break ;             case  "msg" :                 if  (to == null  || to.equals("" )) {                     userList.forEach((User u) -> {                         if (!u.getName().equals(from)) {                             String msg = from + ": "  + content;                             u.putMessage(msg);                         }                     });                 }else {                     userList.forEach((User u)->{                         if (u.getName().equals(to)){                             u.putMessage(from + ": " +content);                         }                     });                 }                 break ;         }     }     @Override      public  void  addUser (User user)           this .userList.add(user);     }     @Override      public  void  addFileServer (FileServer fileServer)           this .fileServerList.add(fileServer);     } } 
测试类 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public  class  MediatorTest      @Test      public  void  test ()  throws  Exception         Mediator mediator = new  ConcreteMediator();         FileServer fileServer = new  FileServer(mediator);         User u1 = new  User(mediator);         User u2 = new  User(mediator);         User u3 = new  User(mediator);         u1.setName("leithda" );         u2.setName("mellofly" );         u3.setName("吃瓜群众" );         u3.uploadFile("三国演义" );         u2.uploadFile("设计模式" );         u1.pushMessage("Hello, mellofly, Where are you?" ,"mellofly" );         u2.pushMessage("Hi,Le,我在上海,我上传了一个文件叫《设计模式》" ,"leithda" );         u1.pushMessage("大家,mellofly上传了《设计模式》,大家快去看啊" ,"" );         u1.downloadFile("设计模式" );         u2.downloadFile("三国演绎" );         u2.downloadFile("三国演义" );         u3.downloadFile("设计模式" );         u1.showMessages();         u2.showMessages();         u3.showMessages();         fileServer.showFileList();     } } 
Example 
Refence