资讯专栏INFORMATION COLUMN

设计模式之中介者模式

jackwang / 2232人阅读

摘要:中介者模式的应用中介者模式的优点就是减少类间的依赖,将一对多的依赖变成一对一的依赖,降低耦合,符合迪米特法则。中介者模式适用于多个对象之间出现紧密联系,类图成网状结构,使用中介者模式可以梳理为星型结构,有助于理解其关系。

前言

由于最近疯狂加班,博客都停更许久,难过~.~

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

代码分析

我们来模仿一个进销存系统,主要有三个部分,销售、库存和进货。

/**
 * 采购管理,主要负责是否采购糖果
 */
public class CandyPurchase {

    public void buyCandy(int number){
        CandySale candySale = new CandySale();
        CandyStock candyStock = new CandyStock();
        if (candySale.getSaleStauts()>6){
            candyStock.addStock(number);
            System.out.println("采购糖果"+number+"颗");
        }else {
            candyStock.addStock(number/2);
            System.out.println("采购糖果"+number/2+"颗");
        }
        System.out.println("库存"+CandyStock.stockNum+"颗");
    }

    public void refuseBuyCandy(){
        System.out.println("拒绝进货");
    }
}
/**
 * 销售类:
 */
public class CandySale {

    public void saleCandy(int num){
        while (CandyStock.stockNum
//库存
public class CandyStock {
    //库存数量
    protected static int stockNum =1000;

    public synchronized void addStock(int num){
        stockNum+=num;
    }

    public synchronized void subtractStock(int num){
        stockNum-=num;
    }

    public void clearStock(){
        System.out.println("马上年底了,清仓大甩卖了");
        CandyPurchase candyPurchase = new CandyPurchase();
        candyPurchase.refuseBuyCandy();

        CandySale candySale = new CandySale();
        candySale.discountSale();
    }
}
public class Client {
    public static void main(String[] args) {

        System.out.println("-----采购糖果-----");
        CandyPurchase candyPurchase = new CandyPurchase();
        candyPurchase.buyCandy(666);

        System.out.println("-----销售糖果-----");
        CandySale candySale = new CandySale();
        candySale.saleCandy(20);
        System.out.println("-----清库处理-----");
        CandyStock candyStock = new CandyStock();
        candyStock.clearStock();
    }
}
测试结果:
-----采购糖果-----
采购糖果666颗
库存1666颗
-----销售糖果-----
卖出20颗糖
-----清库处理-----
马上年底了,清仓大甩卖了
拒绝进货
打折销售糖果1646颗

结果和我们预期的一致,但我们这三者是彼此关联的,每个类都与其他两个类发生了关系(纯洁点,不要想歪~,~)。迪米特法则认为每个类应只和朋友类交流,而且朋友类并非越多越好,朋友类越多,耦合性越大,修改一个就要从全局考量是否影响到了其他模块,这不是面向对象设计所期望的。让我们用中介者模式把其优化下吧,代码如下:

public abstract class AbstractCandyMediator {
    protected CandyStock candyStock;
    protected CandySale candySale;
    protected CandyPurchase candyPurchase;

    public AbstractCandyMediator() {
        this.candyStock = new CandyStock(this);
        this.candySale = new CandySale(this);
        this.candyPurchase = new CandyPurchase(this);
    }

    public abstract void execute(String type,Object ...objects);

}
public class ConcreteCandyMediator extends AbstractCandyMediator{

    @Override
    public void execute(String type, Object... objects) {
        if (type.equals("buyCandy")){
            this.buyCandy((Integer) objects[0]);
        }else if (type.equals("saleCandy")){
            this.saleCandy((Integer) objects[0]);
        }else {
            this.clearStock();
        }
    }

    private void buyCandy(int num) {
        if (super.candySale.getSaleStauts()>6){
            super.candyStock.addStock(num);
            System.out.println("采购糖果"+ num+"颗");
        }else {
            super.candyStock.addStock(num/2);
            System.out.println("采购糖果"+num /2+"颗");
        }
        System.out.println("库存"+CandyStock.stockNum+"颗");
    }

    public void saleCandy(int num){
        while (CandyStock.stockNum
public abstract class AbstractColleague {
    public AbstractCandyMediator mediator;

    public AbstractColleague(AbstractCandyMediator mediator) {
        this.mediator = mediator;
    }
}
public class CandyPurchase extends AbstractColleague {

    public CandyPurchase(AbstractCandyMediator abstractCandyMediator) {
        super(abstractCandyMediator);

    }

    public void buyCandy(int number){
        super.mediator.execute("buyCandy",number);
    }

    public void refuseBuyCandy(){
        System.out.println("拒绝进货");
    }
}
public class CandySale extends AbstractColleague {

    public CandySale(AbstractCandyMediator abstractCandyMediator) {
        super(abstractCandyMediator);

    }

    public void saleCandy(int num){
        super.mediator.execute("saleCandy",num);
    }

    //打折销售
    public void discountSale(){
        System.out.println("打折销售糖果"+CandyStock.stockNum+"颗");
    }

    //获得最近的销售状态,0-10,越大越好卖
    public int getSaleStauts(){
        Random random = new Random();
        return random.nextInt(10);
    }
}
public class CandyStock extends AbstractColleague{
    //库存数量
    protected static int stockNum =1000;

    public CandyStock(AbstractCandyMediator abstractCandyMediator) {
        super(abstractCandyMediator);

    }

    public synchronized void addStock(int num){
        stockNum+=num;
    }

    public synchronized void subtractStock(int num){
        stockNum-=num;
    }

    public void clearStock(){
        super.mediator.execute("123");

    }
}
public class Client {

    public static void main(String[] args) {

        AbstractCandyMediator mediator = new ConcreteCandyMediator();
        CandyPurchase candyPurchase = new CandyPurchase(mediator);
        candyPurchase.buyCandy(666);
        CandySale candySale = new CandySale(mediator);
        candySale.saleCandy(20);
        CandyStock candyStock = new CandyStock(mediator);
        candyStock.clearStock();
    }
}

经过改造,我们发现每个类都只与中介者是朋友类,耦合降低,每个类只处理自己的职责,和其他类有关的统统交给中介者。

中介者模式的应用

中介者模式的优点就是减少类间的依赖,将一对多的依赖变成一对一的依赖,降低耦合,符合迪米特法则。缺点就是中介者会变得异常庞大,逻辑复杂,同事类越多,中介者的逻辑就越复杂。中介者模式适用于多个对象之间出现紧密联系,类图成网状结构,使用中介者模式可以梳理为星型结构,有助于理解其关系。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68200.html

相关文章

  • 实用模式介者模式

    摘要:好,师傅我们要学习帝吧人民,进能打,退能刷淘宝。恩,大致过程就是这样,我们使用中介者模式想一想。首先,数据需要放在中介者模式内,用户的一切操作,都会传递给中介者模式,由他来选择是哪一个部分发生改变。 俗话说,一个模式三个坑。 中介者模式应该算最坑的一个模式,坑不在于他的原理。而在于他的名字和其他模式的使用,真尼玛像。首先,中介者 好像是一切模式里面都有的一个东西,比如,享元模式中-元对...

    AlexTuan 评论0 收藏0
  • 设计模式介者模式

    摘要:用中介者模式实现土豆馒头豆包地瓜土豆馒头豆包地瓜土豆馒头输出缺陷使用中介者模式可以很大程度上避免对象之间的相互影响,无论是对于代码的可读性以及逻辑性都可以简化。 中介者模式 我们知道在程序中各个对象之间并不是完全独立的,相互之间是可能存在关系的,并且可能会相互影响的,就像这样。 showImg(https://segmentfault.com/img/bVJ8wK?w=428&h=51...

    shixinzhang 评论0 收藏0
  • javascript介者模式

    摘要:中介者模式中介者模式对象和对象之间借助第三方中介者进行通信。将就用下这个这个函数充当中介者挑戰成功挑战失败选手选手选手选手挑战成功选手挑战成功选手挑战失败在这段代码中之间没有直接发生关系而是通过另外的对象建立链接姑且将之当成是中介者模式了。 中介者模式 中介者模式: 对象和对象之间借助第三方中介者进行通信。 showImg(https://segmentfault.com/img/bV...

    LucasTwilight 评论0 收藏0
  • 一起学设计模式 - 介者模式

    摘要:在地球上最大的中介者就是联合国了,它主要用来维护国际和平与安全解决国际间经济社会文化和人道主义性质的问题。所以对于关系比较复杂的系统,我们为了减少对象之间的关联关系,使之成为一个松耦合系统,我们就需要使用中介者模式。 中介者模式(Mediator Pattern)属于行为型模式的一种,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独...

    denson 评论0 收藏0
  • 忘了再看设计模式-行为型

    摘要:推文用设计模式解构三国是一种什么体验行为型设计模式一策略模式工厂模式优化结构状态模式随着状态改变而改变行为。推文状态机与状态模式责任链模式多个对象依次处理请求前者指定后者。代理模式代理针对一个对象,为了增加控制等中介双方都是多个,为了解耦。 策略模式 选择使用封装好的一系列算法,可相互替换。 类比:商店[Context]买完衣服买单[Stratege](现金[Concrete Stra...

    ShevaKuilin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<