网状结构的解藕-中介者模式

(#)定义:用一个中介对象封装一系列的对象交互,中介者使各个对象不需要显示的交互作用,从而使其耦合松散,而且可以独立的改变他们的交互

(#)适用场景如下:

网状结构的解藕-中介者模式

从图一变换成图二以后,系统整体变得很清晰,而且对于中间过程在中介中进行封装,很容易进行扩展、

(#)TALK IS CHEEP    场景:如图二

1.首先我定义一下抽象的同事协作类

public class AbstractColleague {
    protected AbstractMediator mediator;

    public AbstractColleague(AbstractMediator mediator) {
        this.mediator = mediator;
    }


}

接下来定义他的三个具体的实现类

/**
 * 采购
 * Author: scw
 * Time: 16-12-28
 */
public class Purchase extends AbstractColleague {

    public Purchase(AbstractMediator mediator) {
        super(mediator);
    }

    public void buyIBMcomputer(int number){
        super.mediator.execute("purchase.buy",number);
    }

    public void refuseBuyIBM(){
        System.out.println("不再采购IBM");
    }
}

/**
 * 库存
 * Author: scw
 * Time: 16-12-28
 */
public class Stock extends AbstractColleague {
    public Stock(AbstractMediator mediator) {
        super(mediator);
    }

    private static int COMPUTER_NUM=100;

    public void  increase(int num){
        COMPUTER_NUM+=num;
        System.out.println("电脑库存="+COMPUTER_NUM);
    }

    public void decrease(int num){
        COMPUTER_NUM-=num;
        System.out.println("电脑库存="+COMPUTER_NUM);
    }

    public int getStockNumber(){
        return COMPUTER_NUM;
    }

    public void clearStock(){
        System.out.println("清理存货数量为:"+COMPUTER_NUM);
        super.mediator.execute("stock.clear");
    }
}


/**
 * 销售
 * Author: scw
 * Time: 16-12-28
 */
public class Sale extends AbstractColleague {
    public Sale(AbstractMediator mediator) {
        super(mediator);
    }

    public void sellIBMComputer(int num) {
        super.mediator.execute("sale.sell",num);
        System.out.println("销售IBM电脑:"+num);
    }

    public int getSaleStatus(){
        int saleStatus = new Random(System.currentTimeMillis()).nextInt(100);
        System.out.println("IBM电脑销售:"+saleStatus);
        return saleStatus;
    }

    public void offrSale(){
        super.mediator.execute("sale.offSell");
    }
}

2.接下来定义抽象的中介者

/**
 * Author: scw
 * Time: 16-12-28
 */
public abstract class AbstractMediator {
    protected Purchase purchase;
    protected Sale sale;
    protected Stock stock;

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

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

注意其中使用的比较巧妙的就是抽象的execute方法,其中使用...,对于参数进行了一个动态的变换

3.剩下的就是具体的具体的中介实现

/**
 * 具体的中介
 * Author: scw
 * Time: 16-12-28ju
 */
public class Mediator extends AbstractMediator {
    @Override
    public void execute(String str, Object... objects) {
        if(StringUtils.contains(str,"purchase.buy")){
            this.buyComputer((Integer) objects[0]);
        }else if (StringUtils.contains(str,"sale.sell")){
            this.sellComputer((Integer) objects[0]);
        }else if(StringUtils.contains(str,"sale.offSell")){
            this.offSell();
        }else{
            this.clearStock();
        }
    }

    private void buyComputer(int num){
        int saleStatus = super.sale.getSaleStatus();
        if(saleStatus>70){
            System.out.println("销售良好采购IBM电脑:"+saleStatus);
        }else {
            num = num/2;
            System.out.println("销售不好采购IBM电脑:"+saleStatus);

        }
        super.stock.increase(num);
    }

    private void sellComputer(int num){
        if(super.stock.getStockNumber()<num){
            super.purchase.buyIBMcomputer(num);
        }
        super.stock.increase(num);
    }

    private void offSell(){
        System.out.println("折价销售电脑"+stock.getStockNumber());
    }

    private void clearStock(){
        super.sale.offrSale();
        super.purchase.refuseBuyIBM();
    }
}

(#)总结,对于上面代码的理解就是:中介持有所有要组合使用的对象,然后当单独调用的一个其中的步奏的时候,回调中介的execute方法,在中介中对于这些不走

进行组装拼接.ok,但是请注意,中介者的缺点是中介者可能膨胀的很大,关系越多那么越复杂,所以注意使用的场景,就比如上图,当各个操作出现一个网状结构的时候,

很适合使用这种模式