`

设计模式之中介者模式

阅读更多

        中介者模式又叫调停模式,定义如下:用一个中介者对象封装一系列的对象的交互,中介者使各个对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。

 

通用类图如下:

 



 

从图中可以看到,中介者模式由一下几部分组成:

1.抽象中介者模式Mediator

抽象中介模式定义统一的接口,用于各同事角色之间的通信

 

2.具体中介者模式ConcreteMediator

具体中介者角色通过协调各个同事角色实现协作行为,因此它必须依赖于各个同事角色

 

3.同事角色Colleague

每一个同事角色都知道中介者角色,而且其他的同事角色通信的时候,一定要通过中介角色的协作

 

说完中介者的通用类图,下面看看如何应用以及应用中介者模式有哪些好处

现实生活中存在很多的中介者模式,比如和我们自身相关的那就是租房,大家从学校毕业来到社会上工作的第一件事可能就是租房(有房的除外),然后才是找工作,还有就是机场的调度中心其实也是一个中介者模式的体现,还有我们做开发现在用的最多一种结构MVC也是中介模式的体现,其中C叫做控制器,V--视图,M--业务逻辑,前端想要显示什么数据首先会询问C然后又C去询问M而不是通过V直接询问M,这样的设计就是为了松耦合,这也是中介者模式的优点,下面我们以一个实际应用来说明:

 

一家奔驰的4S店主要设计到的角色有:销售部门、采购部门、库存部门

 

销售部门:

销售部门要反馈销售情况,畅销就多采购,不畅销就少采购,同事卖出后要通知库存部门

 

库存部门:

即使是畅销情况,如果库存已经超过某个上限也就不需要在采购了

 

 下面是没有使用中介者模式的类图


 
 

 

/**
 * 销售部门
 * 
 */
public class Sale {

    // 销售奔驰汽车
    public void sellBenz(int carNum) {

        // 访问库存
        Stock stock = new Stock();
        // 判断购买量和库存量
        if (stock.getStockNum() < carNum) {
            // 库存不够,通知采购部门进行采购
            Purchase purchase = new Purchase();

            purchase.buyBenz(carNum);
        }
        System.out.println("销售汽车:" + carNum + "辆");
        // 更新库存
        stock.decrease(carNum);
    }

    // 打折销售
    public void offSale() {

        // 访问库存
        Stock stock = new Stock();

        System.out.println("打折处理汽车数量:" + stock.getStockNum());
    }

    // 获取销售状态,用数字0-10来表示,0没有销售,10代表非常畅销
    public int getSaleStatus() {

        Random random = new Random(System.currentTimeMillis());

        int saleStatus = random.nextInt(10);

        System.out.println("汽车的销售情况:" + saleStatus);

        return saleStatus;
    }
}

 

/**
 * 采购部门
 * 
 */
public class Purchase {

    // 采购奔驰汽车
    public void buyBenz(int carNum) {

        // 询问销售部门汽车的销售情况,如果销售状态>8则进行采购,如果是0就暂时不采购,如果处于0--8之间则进行折半采购
        Sale sale = new Sale();
        if (sale.getSaleStatus() == 0) {
            System.out.println("销售情况不好,暂时不采购");
        } else if (sale.getSaleStatus() < 8) {
            int halfNum = carNum / 2;
            System.out.println("销售情况不算理想,进行折半采购,采购汽车数量:" + halfNum);
            // 更新库存
            Stock stock = new Stock();
            stock.increase(halfNum);

        } else {
            System.out.println("采购汽车:" + carNum + "量");
            // 更新库存
            Stock stock = new Stock();
            stock.increase(carNum);
        }
    }

    // 不在采购
    public void refuseBuyBenz() {

        System.out.println("不在采购汽车");
    }
}

 

/**
 * 库存部门
 * 
 */
public class Stock {

    // 库存中默认100辆奔驰
    public static int DEFAULT_NUM = 100;

    // 库存汽车容量的上限
    public static final int MAX_NUM = 200;

    // 增加库存
    public void increase(int carNum) {

        DEFAULT_NUM += carNum;

        System.out.println("现在库存量:" + DEFAULT_NUM);
    }

    // 减少库存
    public void decrease(int catNum) {

        DEFAULT_NUM -= catNum;

        System.out.println("现在库存剩余量:" + DEFAULT_NUM);
    }

    // 获取库存量
    public int getStockNum() {

        return DEFAULT_NUM;
    }

    // 清理库存
    public void clearStock() {

        // 通知销售
        Sale sale = new Sale();

        sale.offSale();

        // 通知采购
        Purchase purchase = new Purchase();

        purchase.refuseBuyBenz();
    }
}

 

public class Client {

    public static void main(String[] args) {

        // 采购人员采购汽车
        System.out.println("-----采购汽车------");
        Purchase purchase = new Purchase();
        purchase.buyBenz(20);

        // 销售人员销售汽车
        System.out.println("-----销售汽车------");
        Sale sale = new Sale();
        sale.sellBenz(50);

        // 清理库存
        System.out.println("-----清理库存-------");
        Stock stock = new Stock();
        stock.clearStock();
    }

}

 

相信大家已经看出这段程序的问题,那就是销售、采购、库存之间耦合太紧了,稍微有一个程序需要修改,那么可能就会导致一片程序的修改,下面看看引入中介者模式之后的效果:

 



 

/**
 * 抽象中介者
 * 
 */
public abstract class AbstractMediator {

    protected Sale sale;

    protected Purchase purchase;

    protected Stock stock;

    public AbstractMediator() {

        sale = new Sale(this);
        purchase = new Purchase(this);
        stock = new Stock(this);
    }

    protected abstract void exec(String str, Integer... num);
}

 

/**
 * 
 * 具体中介者
 */
public class Mediator extends AbstractMediator {
    

    /**
     * @param str
     * @param num
     */
    @Override
    protected void exec(String str, Integer... num) {

        if ("buy".equals(str)) {
            this.buyBenz(num[0]);
        }

        if ("sell".equals(str)) {

            this.sellBenz(num[0]);
        }

        if ("offSale".equals(str)) {

            this.offSale();
        }

        if ("clear".equals(str)) {

            this.clearStock();
        }
    }

    // 清理库存
    public void clearStock() {

        // 通知销售
        super.sale.offSale();

        // 通知采购
        super.purchase.refuseBuyBenz();
    }

    // 打折销售
    private void offSale() {

        // 访问库存

        System.out.println("打折处理汽车数量:" + super.stock.getStockNum());
    }

    // 采购奔驰汽车
    private void buyBenz(int carNum) {

        // 询问销售部门汽车的销售情况,如果销售状态>8则进行采购,如果是0就暂时不采购,如果处于0--8之间则进行折半采购

        if (super.sale.getSaleStatus() == 0) {
            System.out.println("销售情况不好,暂时不采购");
        } else if (super.sale.getSaleStatus() < 8) {
            int halfNum = carNum / 2;
            System.out.println("销售情况不算理想,进行折半采购,采购汽车数量:" + halfNum);
            // 更新库存
            super.stock.increase(halfNum);

        } else {
            System.out.println("采购汽车:" + carNum + "量");
            // 更新库存
            super.stock.increase(carNum);
        }
    }

    // 销售奔驰汽车
    private void sellBenz(int carNum) {

        // 访问库存
        // 判断购买量和库存量
        if (super.stock.getStockNum() < carNum) {
            // 库存不够,通知采购部门进行采购

            super.purchase.buyBenz(carNum);
        }
        System.out.println("销售汽车:" + carNum + "辆");
        // 更新库存
        super.stock.decrease(carNum);
    }

}

 

/**
 * 抽象同事类
 * 
 */
public abstract class AbstractColleague {

    protected AbstractMediator mediator;

    public AbstractColleague(AbstractMediator mediator) {

        this.mediator = mediator;
    }
}

 

/**
 * 销售部门
 * 
 */
public class Sale extends AbstractColleague {

    /**
     * @param mediator
     */
    public Sale(AbstractMediator mediator) {
        super(mediator);
    }

    // 销售奔驰汽车
    public void sellBenz(int carNum) {

        super.mediator.exec("sell", 50);
    }

    // 打折销售
    public void offSale() {

        super.mediator.exec("offSale");
    }

    // 获取销售状态,用数字0-10来表示,0没有销售,10代表非常畅销
    public int getSaleStatus() {

        Random random = new Random(System.currentTimeMillis());

        int saleStatus = random.nextInt(10);

        System.out.println("汽车的销售情况:" + saleStatus);

        return saleStatus;
    }
}

 

/**
 * 库存部门
 * 
 */
public class Stock extends AbstractColleague {

    /**
     * @param mediator
     */
    public Stock(AbstractMediator mediator) {
        super(mediator);
        // TODO Auto-generated constructor stub
    }

    // 库存中默认100辆奔驰
    public static int DEFAULT_NUM = 100;

    // 库存汽车容量的上限
    public static final int MAX_NUM = 200;

    // 增加库存
    public void increase(int carNum) {

        DEFAULT_NUM += carNum;

        System.out.println("现在库存量:" + DEFAULT_NUM);
    }

    // 减少库存
    public void decrease(int catNum) {

        DEFAULT_NUM -= catNum;

        System.out.println("现在库存剩余量:" + DEFAULT_NUM);
    }

    // 获取库存量
    public int getStockNum() {

        return DEFAULT_NUM;
    }

    // 清理库存
    public void clearStock() {

        super.mediator.exec("clear", DEFAULT_NUM);
    }
}

 

/**
 * 采购部门
 * 
 */
public class Purchase extends AbstractColleague {

    /**
     * @param mediator
     */
    public Purchase(AbstractMediator mediator) {
        super(mediator);
    }

    // 采购奔驰汽车
    public void buyBenz(int carNum) {

        super.mediator.exec("buy", 20);
    }

    // 不在采购
    public void refuseBuyBenz() {

        System.out.println("不在采购汽车");
    }
}

 

public class Client {

    public static void main(String[] args) {

        // 创建一个中介者
        AbstractMediator mediator = new Mediator();
        // 采购人员采购汽车
        System.out.println("-----采购汽车------");
        Purchase purchase = new Purchase(mediator);
        purchase.buyBenz(20);

        // 销售人员销售汽车
        System.out.println("-----销售汽车------");
        Sale sale = new Sale(mediator);
        sale.sellBenz(50);

        // 清理库存
        System.out.println("-----清理库存-------");
        Stock stock = new Stock(mediator);
        stock.clearStock();
    }

}

 

中介者模式简单,但是简单并不代表容易使用,而且有时候很容易被误用,大家可以尝试在如下情况使用中介者模式:

1.多个对象之间产生了相互依赖的关系

2.多个对象之间有依赖关系,但是依赖行为尚不确定或者有发生改变的可能

  • 大小: 21.7 KB
  • 大小: 34.8 KB
  • 大小: 41.3 KB
  • 大小: 74.7 KB
分享到:
评论

相关推荐

    设计模式之中介者模式(Mediator Pattern)

    **设计模式之中介者模式(Mediator Pattern)** 在软件工程中,设计模式是一种解决常见问题的经验总结,它提供了一种可复用的解决方案。中介者模式是行为设计模式之一,其主要目的是降低多个对象之间的复杂性,通过...

    java设计模式之中介者模式

    中介者模式是一种行为设计模式,它用于简化多个对象之间的交互,通过引入一个中介对象来解耦原本直接相互作用的对象。在Java编程中,这种模式尤其有用,因为它可以帮助我们减少类之间的耦合,提高代码的可读性和可...

    Java教程-Java设计模式之中介者模式.docx

    Java设计模式中的中介者模式是一种行为设计模式,其主要目的是减少对象之间的直接交互,从而降低对象间的耦合度。在日常生活中,我们常常会遇到房屋中介、留学中介等,它们作为一个中间媒介,使得原本需要直接打交道...

    JAVA设计模式—中介者模式

    今天我们要探讨的是“中介者模式”,一种在对象间建立通信桥梁的设计模式,它使得原本直接相互依赖的对象可以解耦,降低系统的复杂性。 在Java中,中介者模式通过一个中心类(中介者)来协调各个对象之间的交互,...

    设计模式专题之(十七)中介者模式---设计模式中介者模式示例代码(python--c++)

    **中介者模式**是软件设计模式中的一种结构型模式,它的主要目的是降低多个对象之间的复杂交互,通过引入一个中介对象来统一这些交互。在实际应用中,当对象间的交互变得日益复杂,导致类与类之间的关系过于紧密时,...

    设计模式之蝉

    《设计模式之蝉》这本书可能是对设计模式的一种形象化描述,或是以蝉为比喻来讲解设计模式的概念。蝉在地下蛰伏多年,最终破土而出,仅生活在地面上的几周时间。这一生命周期与设计模式的持久价值有异曲同工之妙,即...

    设计模式之美——教你写出高质量代码

    "设计模式之美——教你写出高质量代码"这个主题旨在帮助开发者更好地理解和应用设计模式,从而提升代码的质量和可维护性。设计模式不仅对面试有所帮助,也是职场发展中的必备技能,无论你使用哪种开发语言。 设计...

    Java设计模式之禅

    《Java设计模式之禅》是一本深入浅出讲解设计模式的书籍,书中不仅包含23种经典设计模式的案例,还详细介绍了设计模式背后的思想和原则,适合初学者以及对设计模式有一定了解的程序员阅读。本书旨在帮助读者理解如何...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...

    设计模式之美—学习笔记

    在这个“设计模式之美”的学习笔记中,我们将探讨一些主要的设计模式,以及它们在实际开发中的应用。 首先,我们从创建型模式开始。这类模式主要用于对象的创建,如单例模式(Singleton)、工厂模式(Factory ...

    Android编程设计模式之中介者模式详解

    Android 编程设计模式之中介者模式详解 中介者模式(Mediator Pattern)是一种非常重要的设计模式,它主要用于解决多个对象之间的交互问题。在 Android 编程中,中介者模式广泛应用于解决复杂的对象交互问题。 ...

    c#设计模式之中介者

    总结起来,C#中的中介者设计模式提供了一种有效的手段来管理对象间的通信,通过中介者对象集中处理复杂的交互逻辑,降低了对象之间的耦合,提高了代码的可读性和可维护性。理解和掌握这一模式对于提升C#开发者的设计...

    设计模式之《大话设计模式》.pptx

    设计模式之《大话设计模式》.pptx

    人人都懂设计模式 人人都懂设计模式

    人人都懂设计模式 设计模式是软件开发中的一种解决方案,它提供了一种通用的设计思想和方法论,可以帮助开发者更好地设计和实现软件系统。设计模式可以分为三大类:创建型模式、结构型模式和行为型模式。 在本书中...

    java常用设计模式-中介者模式

    中介者模式(Mediator Pattern)是一种行为设计模式,它允许对象之间通过中介者对象进行通信,从而避免对象之间的直接耦合。中介者模式将对象之间的复杂关系转化为中介者和对象之间的简单关系,从而提高了系统的灵活...

    设计模式之我见

    ### 设计模式之我见 #### 设计模式的定义与意义 设计模式(Design Pattern)是一种在软件开发过程中被广泛采用的方法论,它基于一系列反复验证的解决方案,旨在提高代码的可读性、可重用性和可靠性。设计模式是...

    设计模式 - 中介者模式(C++实例)

    **中介者模式(Mediator Pattern)**是一种行为设计模式,它定义了一个用来封装一系列对象交互的接口。在软件工程中,当多个对象之间存在复杂的相互依赖关系时,这种模式可以帮助我们降低系统的耦合度,使得各个对象...

    GOF设计模式中英文+设计模式精解中英文

    GOF(Gang of Four)设计模式,由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位专家在他们的著作《设计模式:可复用面向对象软件的基础》中提出,被誉为设计模式的经典之作。本资源包含了GOF设计...

Global site tag (gtag.js) - Google Analytics