中介者模式
意图
用一个中介对象来封装一些列的对象交互。中介者是哥哥对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互
适用性
1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构婚恋且难以理解
2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象
3、定制一个分布在多个类中的行为,又不想生成太多子类
温馨提示
MVC模式,其中C就是M和V的中介者,仔细思考一下。
结构
Mediator
中介者定义一个接口用于与Colleague通信
ConcreteMedaitor
具体中介者通过协调各个Colleague对象协作行为
了解并维护他的各个Colleague
Colleague class
每一个同事类都知道他的中介者对象
每一个同事类在需要与其他同事通信时,与他的中介者通信
一个图介绍中介者模式
一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定
如果引入中介者模式,那么同事类之间的关系将变为星型结构,通过中介者来处理同事之间的关系
实现
package mediator;
/**
* @Author fitz.bai
* @Date 2018/9/5 21:16
* 中介者
*/
public class ChatRoom {
public static void showMessage(User user, String message) {
System.out.println( user.getName() + "says that" + message);
}
}
package mediator;
/**
* @Author fitz.bai
* @Date 2018/9/5 21:18
*/
public class User {
private String name;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void sendMessage(String message) {
ChatRoom.showMessage(this, message);
}
}
package mediator;
/**
* @Author fitz.bai
* @Date 2018/9/5 21:15
*/
public class Client {
public static void main(String[] args) {
User axe = new User("斧王");
User antiMagic = new User("敌法师");
axe.sendMessage("Hooooo! 斧王来了!");
antiMagic.sendMessage("aaa! 消灭魔法!");
}
}
/**
斧王says thatHooooo! 斧王来了!
敌法师says thataaa! 消灭魔法!
*/
优点
1、减少子类的生成
2、他将各个Colleague解耦
3、简化了对象协议
4、他对对象如何协作进行了抽象
5、他使控制集中化
缺点
中介者类中包含了大量同事之间的交互细节,会导致其内容逻辑非常复杂,使得系统难以维护