设计模式(十七)中介者(调停者)模式

1、概述

中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。

2、适用场景

1)当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。
2)当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。
3)如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

3、实例

有以下场景:

有一个商城系统,内部又很多个功能:
订单功能,支付功能,商品功能,购物车功能,库存功能。

假设功能依赖关系如下。
订单需要关联支付、商品、库存。
支付需要关联订单、商品。
商品需要关联库存。
购物车需要关联商品、订单、库存。

使用中介者优化。

创建商品抽象接口:

/**
 * shop抽象接口
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public interface IShop {
}

创建商城的五个组件:

/**
 * 商品
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class Goods implements IShop {

    public void getGoods() {
        System.out.println("查询商品信息");
    }
}
/**
 * 支付
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class Pay implements IShop {

    public void pay() {
        System.out.println("支付成功");
    }
}
/**
 * 库存
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class Inventory implements IShop {

    public void getInventory() {
        System.out.println("查询库存信息成功");
    }
}
/**
 * 订单
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class Order implements IShop {

    public void order(){
        System.out.println("下单成功");
    }

}
/**
 * 购物车
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class ShoppingCar implements IShop {

    public void addShoppingCar() {
        System.out.println("添加购物城成功");
    }
}

中介者抽象接口:

/**
 * 中介者
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public interface Mediator {

    /**
     * 下单
     */
    void order();

    /**
     * 查询商品
     */
    void getGoods();

    /**
     * 查询库存
     */
    void getInventory();

    /**
     * 支付
     */
    void pay();

    /**
     * 添加购物车
     */
    void addShoppingCar();
}

具体的中介者类:

/**
 * 具体商品中介者
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class ShopMediator implements Mediator {

    private Order order;
    private Goods goods;
    private Inventory inventory;
    private Pay pay;
    private ShoppingCar shoppingCar;


    @Override
    public void order() {
        order.order();
    }

    @Override
    public void getGoods() {
        goods.getGoods();
    }

    @Override
    public void getInventory() {
        inventory.getInventory();
    }

    @Override
    public void pay() {
        pay.pay();
    }

    @Override
    public void addShoppingCar() {
        shoppingCar.addShoppingCar();
    }

    public void register(IShop shop){
        if (shop.getClass().getName() == Order.class.getName()){
            order = new Order();
        }
        if (shop.getClass().getName() == Pay.class.getName()){
            pay = new Pay();
        }
        if (shop.getClass().getName() == Goods.class.getName()){
            goods = new Goods();
        }
        if (shop.getClass().getName() == Inventory.class.getName()){
            inventory = new Inventory();
        }
        if (shop.getClass().getName() == ShoppingCar.class.getName()){
            shoppingCar = new ShoppingCar();
        }
    }
}

测试类:

/**
 * 测试类
 * @date: 2021/1/13
 * @author weirx
 * @version 3.0
 */
public class TestDemo {

    public static void main(String[] args) {
        //创建一个商城中介者
        ShopMediator shopMediator  = new ShopMediator();
        //注册商城内的元素
        shopMediator.register(new Goods());
        shopMediator.register(new ShoppingCar());
        shopMediator.register(new Order());
        shopMediator.register(new Pay());
        shopMediator.register(new Inventory());
        //调用方法
        shopMediator.getGoods();
        shopMediator.getInventory();
        shopMediator.addShoppingCar();
        shopMediator.order();
        shopMediator.pay();
    }
}

结果:

查询商品信息
查询库存信息成功
添加购物城成功
下单成功
支付成功

4、分析

在没有使用中介者的情况下,各功能的调用情况如下所示:


未使用.png

使用中介者后,如下所示:


中介者.png

中介者的关系图:


image.png

综上能看到,使用中介者模式,确实能使各组件间达到解耦的目的,但是过度的使用会导致中介者过大。

5、总结

优点:
1)单一原则。
2)开闭原则。
3)降低组件间的耦合。
缺点:
过度使用会导致中介者称为上帝对象。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容