中介者模式
用来降低多个对象和类之间的通信复杂性
提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护
使用步骤与意图
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理
何时使用:多个类相互耦合,形成了网状结构
如何解决:将上述网状结构分离为星型结构
关键代码:对象 Colleague 之间的通信封装到一个类中单独处理
优缺点
优点:
1)降低了类的复杂度,将一对多转化成了一对一
2)各个类之间的解耦
3)符合迪米特原则
缺点:
中介者会庞大,变得复杂难以维护
迪米特法则
又叫作最少知识原则,一个类对于其他类知道的越少越好,就是说一个对象应当对其他对象有尽可能少的了解
对于OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用
每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系
迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达
因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度
实现
多个用户可以向聊天室发送消息,聊天室向所有的用户显示消息
1.创建中介者类 ChatRoom 和 User类,User 对象使用 ChatRoom方法来分享他们的消息
public class ChatRoom {
public static void showMessage(User user, String message){
System.out.println(new Date().toString()
+ " [" + user.getName() +"] : " + message);
}
}
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name){
this.name = name;
}
public void sendMessage(String message){
ChatRoom.showMessage(this,message);
}
}
public class MediatorDemo {
public static void main(String[] args) {
User robert = new User("Robert");
User john = new User("John");
robert.sendMessage("Hi! John!");
john.sendMessage("Hello! Robert!");
}
}
3.执行输出
Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!
评论