一.中介者设计模式介绍
中介者模式定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。例如构建一个群聊应用,如果没有中介者,每个用户向其他用户发送消息时都要与其他用户直接联系(显示引用),并且当新添加一个用户时还得与新用户建立联系,整个应该耦合性高,扩展起来比较复杂。当有中介者时,每个来用户直接和中介者联系,具体的消息发送与新用户的添加由中介者去复杂维护,这样程序耦合性显著降低,每个用户的行为也相互独立。
二.中介者模式代码用例
1.中介者抽象接口ChatMediator
interface ChatMediator { public void sendMessage(String msg, User user); void addUser(User user); }
2.用户抽象类User
拥有一个中介者的引用,
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); public abstract void receive(String msg); }
3.中介者实例CharMediatorImpl
拥有一个群聊中的用户列表以及一个发送群消息的业务逻辑:
class ChatMediatorImpl implements ChatMediator { private List<User> users; public ChatMediatorImpl(){ this.users=new ArrayList<>(); } @Override public void addUser(User user){ this.users.add(user); } @Override public void sendMessage(String msg, User user) { for(User u : this.users){ //message should not be received by the user sending it if(u != user){ u.receive(msg); } } } }
4.用户实例UserImpl
class UserImpl extends User { public UserImpl(ChatMediator med, String name) { super(med, name); } @Override public void send(String msg){ System.out.println(this.name+": Sending Message="+msg); mediator.sendMessage(msg, this); } @Override public void receive(String msg) { System.out.println(this.name+": Received Message:"+msg); } }
5.聊天应用客户端ChatClient
public class ChatClient { 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"); } }
测试输出
Pankaj: Sending Message=Hi All
Lisa: Received Message:Hi All
Saurabh: Received Message:Hi All
David: Received Message:Hi All
三.中介者设计模式要点及场景
1.当对象间的交互是比较复杂的时候,我们可以考虑用一个中心控制节点(中介者)来负责对象间交互的逻辑。
2.Java中,用中介者搭配观察者设计模式,可以实现一个应用去订阅另一个用户或者发送数据给另一个应用。
3.不能仅仅为了实现低耦合而用中介者模式,因为当需要的中介者非常多时程序将变得很难维护。
JDK中用到中介者模式的方法:java.util.Timer类中的scheduleXXX() 方法;Concurrency Executor中的executor方法;java反射中的invoke()方法。