设计模式之禅——中介者模式

来源:互联网 发布:家庭网络用哪个好 编辑:程序博客网 时间:2024/05/29 17:16

中介者模式
用一个中介对象封装一系列的对象交互,从而使其耦合松散,而且可以独立改变它们之间的交互

例子:卖商品的公司各个部分之间的交互

我们知道卖商品的公司一般有这几个部分:采购管理、销售管理、物流管理、供应商管理、存货管理、资产管理。
他们之间的交互如下:

这里写图片描述
是不是特别麻烦?主要是每个模块都需要跟多个模块沟通!实现它的代码就不写了,我们来找一个中介者吧。

这里写图片描述

每个模块只跟中介者交流,简单了很多,层次也不乱

这里我们来实现它的进销存活动。就是采购管理、销售管理、存货管理三者之间的活动。

UML图(idea自动合成,研究不深,可以结合代码理解)如下:
这里写图片描述

见代码

//抽象中介者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);}
//中介者public class Mediator extends AbstractMediator {    //中介者中最重要的方法    @Override    public void execute(String str, Object... objects) {        if (str.equals("purchase.buy")) {            //采购电脑            this.buyComputer((Integer) objects[0]);        } else if (str.equals("sale.sell")) {            //销售电脑            this.sellCompter((Integer) objects[0]);        } else if (str.equals("sale.offsell")) {            //折价销售            this.offsell();        } else if (str.equals("stock.clear")) {            //清仓处理            this.clearStock();        }    }    private void buyComputer(int number){        int saleStatus = super.sale.getSaleStatus();        if(saleStatus > 80){            //销售情况很好            System.out.println("采购IBM电脑:" + number + "台");        }else{            //销售情况不好            int buyNumber = number/2;//折半采购            System.out.println("采购IBM电脑:" + buyNumber + "台");        }    }    private void sellCompter(int number){        if(super.stock.getComputerNumber() < number){            super.purchase.buyIBMcomputer(number);        }else{            super.stock.decrease(number);        }    }    //折价销售    private void offsell(){        System.out.println("折价销售IBM电脑" + stock.getComputerNumber() + "台");    }    //清仓处理    private void clearStock(){        super.sale.offSale();    }}
//抽象同事类public abstract class AbstractColleague {    protected AbstractMediator mediator;    public AbstractColleague(AbstractMediator _mediator){        this.mediator = _mediator;    }}
//购买类public class Purchase extends AbstractColleague{    public Purchase(AbstractMediator _mediator){        super(_mediator);    }    //采购IBM电脑    public void buyIBMcomputer(int number){        super.mediator.execute("purchase.buy", number);    }    //不再采购IBM电脑    public void refuseBuyIBM(){        System.out.println("不再采购IBM电脑");    }}
//库存管理类public class Stock extends AbstractColleague{    public Stock(AbstractMediator _mediator){        super(_mediator);    }    private static int COMPUTER_NUMBER = 100;    //库存增加    public void increase(int number){        COMPUTER_NUMBER = COMPUTER_NUMBER + number;        System.out.println("库存信息为: " + COMPUTER_NUMBER);    }    //库存降低    public void decrease(int number){        COMPUTER_NUMBER = COMPUTER_NUMBER - number;        System.out.println("库存信息为: " + COMPUTER_NUMBER);    }    //获得库存数量    public int getComputerNumber(){        return COMPUTER_NUMBER;    }    //存货压力太大了,就要通知采购人员不要采购,销售人员要尽快销售    public void clearStock() {        System.out.println("清理内存数量为: " + COMPUTER_NUMBER);        super.mediator.execute("stock.clear");    }}
//销售类public class Sale extends AbstractColleague {    public Sale(AbstractMediator _mediator) {        super(_mediator);    }    public void sellIBMComputer(int number){        super.mediator.execute("sale.sell", number);        System.out.println("销售IBM电脑" + number + "台");    }    //反馈销售情况    public int getSaleStatus(){        Random random = new Random(System.currentTimeMillis());        int saleStatus = random.nextInt(100);        System.out.println("IBM电脑的销售情况为:" + saleStatus);        return saleStatus;    }    //折价处理    public void offSale(){        super.mediator.execute("sale.offsell");    }}
//场景类public class Client {    public static void main(String[] args) {        AbstractMediator mediator = new Mediator();        System.out.println("\n----------采购人员采购电脑--------");        Purchase purchase = new Purchase(mediator);        purchase.buyIBMcomputer(100);        System.out.println("\n----------销售人员销售电脑--------");        Sale sale = new Sale(mediator);        sale.sellIBMComputer(1);        System.out.println("\n----------库房管理人员清库处理--------");        Stock stock = new Stock(mediator);        stock.clearStock();    }}/*Output----------采购人员采购电脑--------IBM电脑的销售情况为:71采购IBM电脑:50台----------销售人员销售电脑--------库存信息为: 99销售IBM电脑1台----------库房管理人员清库处理--------清理内存数量为: 99折价销售IBM电脑99台*/

中介者的优点显而易见——解耦和,那么它的应用场景也不必多说——类之间交互过于密切,需要解耦合~

3 0
原创粉丝点击