频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
设计模式:中介者模式浅析(Mediator)
2016-04-05 09:59:00         来源:Restarting JAVA  
收藏   我要投稿

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
这里写图片描述

中介者模式中的角色:
1. 抽象中介者(MediatZ喎"/kf/ware/vc/" target="_blank" class="keylink">vcik8L3N0cm9uZz6jurao0uXBy82sysK21M/ztb3W0L3p1d+21M/z1q685LXEvdO/2qGjPGJyIC8+DQoyLiA8c3Ryb25nPr7fzOXW0L3p1d+jqENvbmNyZXRlTWVkaWF0b3IpPC9zdHJvbmc+o7q2qNLls+nP89bQvenV37XEt723qKOsy/zQ6NKq1qq1wMv509C1xL7fzOXNrMrCwOCjrM2syrHQ6NKqtNO+38zltcTNrMrCwODEx8DvvdPK1c/7z6KjrLKix9LP8r7fzOW1xM2sysLA4Leiy83Qxc+ioaM8YnIgLz4NCjMuIDxzdHJvbmc+s+nP882sysLA4KOoQ29sbGVhZ3Vlo6k8L3N0cm9uZz48YnIgLz4NCjQuIDxzdHJvbmc+vt/M5c2sysLA4KOoQ29uY3JldGVDb2xsZWFndWWjqTwvc3Ryb25nPqO6w7+49r7fzOXNrMrCwOC2vNa70OjSqtaqtcDX1Ly6tcTQ0M6qvLS/yaOstavKx8v8w8e2vNDo0qrIz8q21tC96dXfoaM8L3A+DQo8cD6wuMD9MaO6PGJyIC8+DQq3v87d1+LB3tbQvem+zcrH0ru49rrcusO1xNbQvenEo8q9o6zX4r/N1rvWqrXA19S8urrN1tC96aOst7+2q9Ky1rvWqrXA19S8urrN1tC96aOstavKx9bQvemx2NDr1qq1wNfiv826zbe/tquho6Oo1NrO0sPHtcTJ+rvu1tC0prSms+Sz4tfFJmxkcXVvO9bQvenV3yZyZHF1bzujrLHIyOfX4re/oaLC8re/oaKz9rn9wfTRp6Gi1dK5pNf3oaLCw9POtci/ycTctrzQ6NKqxMTQqdbQvenV37XEsO/W+qGjo6k8YnIgLz4NCjEgs+nP89bQvenV3zwvcD4NCjxwcmUgY2xhc3M9"brush:java;"> public interface Mediator { void contact(String message, Person person); }

2 抽象同事类

public abstract class Person
{
    protected String name;
    protected Mediator mediator;

    Person(String name, Mediator mediator)
    {
        this.name = name;
        this.mediator = mediator;
    }
}

3 具体同事类
房东:

public class HouseOwner extends Person
{
    HouseOwner(String name, Mediator mediator)
    {
        super(name, mediator);
    }

    public void contact(String message)
    {
        mediator.contact(message, this);
    }

    public void getMessage(String message)
    {
        System.out.println("HouseOwner : "+name+", Get Message: "+message);
    }
}

租客:

public class Tenant extends Person
{
    Tenant(String name, Mediator mediator)
    {
        super(name, mediator);
    }

    public void contact(String message)
    {
        mediator.contact(message, this);
    }

    public void getMessage(String message)
    {
        System.out.println("Tenant : "+name+", Get Message: "+message);
    }
}

4 中介

public class MediatorStructure implements Mediator
{
    private HouseOwner houseOwner;
    private Tenant tenant;

    public HouseOwner getHouseOwner()
    {
        return houseOwner;
    }
    public void setHouseOwner(HouseOwner houseOwner)
    {
        this.houseOwner = houseOwner;
    }
    public Tenant getTenant()
    {
        return tenant;
    }
    public void setTenant(Tenant tenant)
    {
        this.tenant = tenant;
    }

    @Override
    public void contact(String message, Person person)
    {
        if(person == houseOwner)
        {
            tenant.getMessage(message);
        }
        else
        {
            houseOwner.getMessage(message);
        }
    }
}

5 测试代码

        MediatorStructure mediator = new MediatorStructure();

        HouseOwner houseOwner = new HouseOwner("qq",mediator);
        Tenant tenant = new Tenant("jj",mediator);

        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);

        tenant.contact("I wanna a house");
        houseOwner.contact("I have~");

运行结果:

HouseOwner : qq, Get Message: I wanna a house
Tenant : jj, Get Message: I have~

优缺点
优点

适当的使用中介者模式可以避免同事类之间的过渡耦合,使得各同事类之间可以相对独立地使用。减少子类的生成。可以减少各同事类的设计与实现。

缺点
1. 由于中介者对象封装了系统中的对象之间的相互关系,导致其变得非常复杂,使得系统维护比较困难。中介者需要知道每个对象和他们之间的交互细节,如果它出问题,将会导致整个系统都会出现问题。所以它比较容易应用也很容易误用。故当系统中出现了“多对多”交互复杂的关系群时,千万别记着使用中介者模式,你首先需要做的就是反思你的系统在设计上是不是合理。再者,在实际工作中,中介者模式也并不多见。


适用场景
1. 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

JDK中的中介者模式:
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()


 

点击复制链接 与好友分享!回本站首页
上一篇:几个opengl立方体绘制案例分析
下一篇:Spring4新特性分析——集成Bean Validation 1.1(JSR-349)到SpringMVC
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站