设计模式之中介者模式

中介者模式定义:用一个中介者对象封装一系列的对象交互,中介者使各个对象不需要显示的相互作用,从而达到解耦的效果,而且可以独立的改变它们之间的交互


中介者模式的通用类图如下:




代码如下:


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

    protected Mediator mediator;

    public Colleague(Mediator mediator) {

        this.mediator = mediator;
    }
}

public class ConcreteColleague2 extends Colleague {

    /**
     * @param mediator
     */
    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }

    // 自由方法
    public void selfMethod2() {

        // 处理自己的逻辑
    }

    // 依赖的方法
    public void depMethod2() {

        // 自己不能处理的逻辑委托给中介者处理
        super.mediator.doSomething2();
    }

}

public class ConcreteColleague1 extends Colleague {

    /**
     * @param mediator
     */
    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }

    // 自由方法
    public void selfMethod1() {

        // 处理自己的逻辑
    }

    // 依赖的方法
    public void depMethod1() {

        //自己不能处理的逻辑,委托给中介者处理
        super.mediator.doSomething1();
    }

}

public abstract class Mediator {

    // 定义同事类
    protected ConcreteColleague1 c1;
    protected ConcreteColleague2 c2;

    // 定义逻辑
    public abstract void doSomething1();

    public abstract void doSomething2();

    public ConcreteColleague1 getC1() {
        return c1;
    }

    public void setC1(ConcreteColleague1 c1) {
        this.c1 = c1;
    }

    public ConcreteColleague2 getC2() {
        return c2;
    }

    public void setC2(ConcreteColleague2 c2) {
        this.c2 = c2;
    }

}

public class ConcreteMediator extends Mediator {

    /**
     * 
     */
    @Override
    public void doSomething1() {

        super.c1.selfMethod1();
        super.c2.selfMethod2();

    }

    /**
     * 
     */
    @Override
    public void doSomething2() {

        super.c1.selfMethod1();
        super.c2.selfMethod2();
    }

}

通过中介者模式的通用代码可能开不出中介者模式到底有什么作用,其实使用中介者模式就是为了减少同事类之间的依赖,下面用一个进销存的例子说明一下中介者模式的作用。


未使用中介者模式时的类图如下:


通过类图其实我们就能够想到代码大概是什么样,那就是每个类都与其他两个有关联,关联越多耦合性越大,下面使用中介者模式修改一下,类图如下:



现在是通过一个中介者模式使其他三个类的耦合性降低,其他三个类之对中介者依赖,由中介者负责与其他类进行交互


代码如下:


/**
 * 抽象同事类
 * 
 */
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 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 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 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 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();
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值