package com.interview.design.pattern.behavioral; import java.util.HashMap; /** * Created_By: stefanie * Date: 14-12-3 * Time: 下午5:46 * * Mediator pattern is used to reduce communication complexity between multiple objects or classes. * This pattern provides a mediator class which normally handles all the communications between different classes * and supports easy maintainability of the code by loose coupling. * * 中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。 * 如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行 */ public class MediatorPattern { static class Message{ public static String EVERYONE = "all"; public String from; public String to; public String message; Message(String from, String to, String message) { this.from = from; this.to = to; this.message = message; } } static interface ChatMediator { public void sendMessage(Message msg, User user); void addUser(User user); } static abstract class User { protected ChatMediator mediator; protected String name; public User(ChatMediator med, String name){ this.mediator=med; this.name=name; } public abstract void send(String msg, String to); public abstract void receive(Message msg); } static class ChatMediatorImpl implements ChatMediator { private HashMap<String, User> users; public ChatMediatorImpl(){ this.users=new HashMap<>(); } @Override public void addUser(User user){ this.users.put(user.name, user); } @Override public void sendMessage(Message msg, User user) { if(Message.EVERYONE.equalsIgnoreCase(msg.to)){ for(User u : this.users.values()){ //message should not be received by the user sending it if(u != user) u.receive(msg); } } else { User u = users.get(msg.to); if(u != null) u.receive(msg); } } } static class UserImpl extends User { public UserImpl(ChatMediator med, String name) { super(med, name); } @Override public void send(String msg, String to){ System.out.println(this.name+": Sending Message: "+msg); mediator.sendMessage(new Message(this.name, to, msg), this); } @Override public void receive(Message msg) { System.out.println(this.name+": Received Message from " + msg.from + ": "+ msg.message); } } public static void main(String[] args) { ChatMediator mediator = new ChatMediatorImpl(); User user1 = new UserImpl(mediator, "Pankaj"); User user2 = new UserImpl(mediator, "Lisa"); User user3 = new UserImpl(mediator, "Saurabh"); User user4 = new UserImpl(mediator, "David"); mediator.addUser(user1); mediator.addUser(user2); mediator.addUser(user3); mediator.addUser(user4); user1.send("Hi All", Message.EVERYONE); System.out.println(); user1.send("Hello David", "David"); } }