前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java设计模式之中介者模式

java设计模式之中介者模式

作者头像
用户4361942
发布2019-05-24 16:59:00
6470
发布2019-05-24 16:59:00
举报
文章被收录于专栏:java程序员思维

中介者模式

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

中介者模式解决的问题

对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

中介者模式角色

抽象中介者(Mediator)角色:它是中介者的接口,提供了合作者对象注册与转发合作者对象信息的抽象方法。

具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理合作者对象,协调各个合作者角色之间的交互关系,因此它依赖于合作者角色。

抽象合作者类(Colleague)角色:定义合作者类的接口,保存中介者对象,提供合作者对象交互的抽象方法,实现所有相互影响的合作者类的公共功能。

具体合作者类(Concrete Colleague)角色:是抽象合作者类的实现者,当需要与其他合作者对象交互时,由中介者对象负责后续的交互。

代码实现

代码语言:javascript
复制
/** * @author zengjianlu * @date 2019/5/15 * 合作者 */public abstract class BaseColleague {
    Mediator mediator;
    String name;
    Integer type;
    public Integer getType() {        return type;    }
    public void setType(Integer type) {        this.type = type;    }
    public Mediator getMediator() {        return mediator;    }
    public String getName() {        return name;    }
    /**     * 发布消息     *     * @param content     */    abstract void sendMessage(String content);
    /**     * 接收消息     *     * @param content     */    abstract void acceptMessage(String content);}
代码语言:javascript
复制
/** * @author zengjianlu * @date 2019/5/15 * * 合作者类型 */public enum ColleagueType {    /**     * 租客类型     */    TENANT(1),    /**     * 房东类型     */    LANDORD(2);    private Integer value;
    ColleagueType(Integer value) {        this.value = value;    }
    public Integer getValue() {        return value;    }
}
代码语言:javascript
复制
/** * @author zengjianlu * @date 2019/5/15 * 租客 */public class Tenant extends BaseColleague {

    public Tenant(Mediator mediator, String name) {        this.mediator = mediator;        this.name = name;        this.type = ColleagueType.TENANT.getValue();    }
    @Override    public void sendMessage(String content) {        System.out.println(this.name + "发布消息:" + content);        mediator.notifyOtherColleague(this, content);    }
    @Override    void acceptMessage(String content) {        System.out.println(this.name + ":" + "接收来自中介的消息:"         + content);    }
}
代码语言:javascript
复制
/** * @author zengjianlu * @date 2019/5/15 * 中介 */public interface Mediator {    /**     * 添加合作者     * @param baseColleague     * @return     */    Mediator addColleague(BaseColleague baseColleague);
    /**     * 通知其他合作者     * @param baseColleague     * @param content     */    void notifyOtherColleague(BaseColleague baseColleague, String content);}
代码语言:javascript
复制
/** * @author zengjianlu * @date 2019/5/15 * 房屋中介 */public class HouseMediator implements Mediator{
    List<BaseColleague> baseColleagues = new ArrayList<BaseColleague>();
    @Override    public Mediator addColleague(BaseColleague baseColleague) {        baseColleagues.add(baseColleague);        return this;    }
    @Override    public void notifyOtherColleague(final BaseColleague baseColleague, String content) {        final String translateContent = baseColleague.getName() + content;        if(!baseColleagues.isEmpty()){           List<BaseColleague> others =  baseColleagues.stream()                   .filter(x->!baseColleague.getType().equals(x.getType())).collect(Collectors.toList());           if(others.isEmpty()){               return;           }           others.stream().forEach(x->{               x.acceptMessage(translateContent);           });        }    }}
代码语言:javascript
复制
/** * @author zengjianlu * @date 2019/5/15 */public class Test {    public static void main(String[] args) {        Mediator mediator = new HouseMediator();        BaseColleague dada = new Tenant(mediator,"租客达达");        BaseColleague haha = new Tenant(mediator,"租客哈哈");
        BaseColleague gaga = new Landlord(mediator,"房东嘎嘎");        BaseColleague hehe = new Landlord(mediator,"房东呵呵");
        mediator.addColleague(dada).addColleague(haha).addColleague(gaga).addColleague(hehe);
        dada.sendMessage("我要租两室一厅的房子");        haha.sendMessage("我要租三室一厅的房子");
        gaga.sendMessage("我要出租两室一厅的房子");        hehe.sendMessage("我要出租三室一厅的房子");
    }}

运行结果:

优缺点

优点:

降低了对象之间的耦合性,使得对象易于独立地被复用,符合迪米特原则。

将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点:

当合作者类太多时,中介者的职责将很大,它会变得复杂而庞大,以至于系统难以维护。

生活中的中介模式

房屋中介是最典型的中介模式,房东要把房子租出去,先把房源信息告诉中介,中介替他把房子租出去。租客要租房子,把自己租房子的要求告诉中介,中介从房东获得的房源信息找出符合条件的房子,介绍给租客,促进双方的交易。中介从中,双向收钱,不仅收房东的手续费,同时也收取租客的介绍费。

很多平台也属于中介模式,天猫、拼多多、美团、饿了么,都是起着连接的作用,促进商家和用户之间的交易,向用户售卖vip、向商家收取佣金。

聊天室、QQ群也属于中介模式,发消息人和接收消息人都是具体的合作者,聊天室服务器就是中介。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java程序员思维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档