您的位置:首页 > 其它

设计模式之中介者模式

2015-10-12 21:10 393 查看

1、核心

-如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量多对多关系,将导致关系及其复杂,这些对象称为“同事对象”

-我们可以引入一个中介者对象,使各个同事对象只跟中介者对象打交道,将复杂的网络结构化解为如下的星形结构



结构图:



2、本质

解耦多个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。

3、应用场景

-MVC模式(其中的C,控制器就是一个中介者对象。M和C都和他打交道)

-窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象

-图形界面开发GUI中,多个组件之间的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象

-java.lang.reflect.Method#invoke()

4、代码示例

问题:



UML图:



/**
* 部门抽象接口
* @author ly1
*
*/
public interface IDepartment {
void selfAction();
void outAction();
}


/**
* 财务部
* @author ly1
*
*/
public class Financial implements IDepartment{
private IMediator mediator;

public Financial(IMediator mediator) {
super();
this.mediator = mediator;
mediator.register("financial", this);
}

@Override
public void selfAction() {
System.out.println("数钱!");
}

@Override
public void outAction() {
mediator.comand("financial");
}

}


/**
* 开发部
* @author ly1
*
*/
public class Development implements IDepartment{
private IMediator mediator;

public Development(IMediator mediator) {
super();
this.mediator = mediator;
mediator.register("development", this);
}

@Override
public void selfAction() {
System.out.println("项目开发中!");
}

@Override
public void outAction() {
mediator.comand("financial");
}

}


/**
* 研发部
* @author ly1
*
*/
public class Research implements IDepartment{
private IMediator mediator;

public Research(IMediator mediator) {
super();
this.mediator = mediator;
mediator.register("research", this);
}

@Override
public void selfAction() {
System.out.println("研究中!");
}

@Override
public void outAction() {
mediator.comand("financial");
}

}


/**
* 中介抽象接口
* @author ly1
*
*/
public interface IMediator {
void comand(String comand);
void register(String name,IDepartment department);
}


import java.util.HashMap;
import java.util.Map;

/**
* 具体中介类:总经理
* @author ly1
*
*/
public class President implements IMediator{

private Map<String,IDepartment> list = new HashMap<String,IDepartment>();

@Override
public void comand(String comand) {
list.get(comand).selfAction();
}

@Override
public void register(String name, IDepartment department) {
list.put(name, department);
}

}


/**
* 客户端调用
* @author ly1
*
*/
public class Client {
public static void main(String[] args) {
IMediator mediator = new President();

IDepartment f = new Financial(mediator);
IDepartment d = new Development(mediator);
IDepartment r = new Research(mediator);

d.selfAction();
d.outAction();
}
}

结果:
项目开发中!
数钱!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: