设计模式之中介者模式

来源:互联网 发布:照相机卡数据视频恢复 编辑:程序博客网 时间:2024/05/19 04:26

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();    }}结果:项目开发中!数钱!
0 0
原创粉丝点击