中介者模式(行为类)

来源:互联网 发布:大脚插件mac更新 编辑:程序博客网 时间:2024/06/13 23:21

UML

这里写图片描述

  • Mediator角色: 抽象中介者角色定义统一的接口,用于各同事角色之间通信
  • ConcreteMediator角色: 具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖各个同事角色
  • Colleague 角色: 每个同事角色都知道中介者角色,而且与其他同事角色通信的时候,一定要通过中介者角色协作。每个同事角色分为两种,一种是同事本身的行为,比如改变自身的状态,处理自己的行为等,叫做自发行为 , 第二种是必须依赖中介者才能完成的行为,叫做依赖方法

介绍

  • 意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互
  • 优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
  • 缺点: 中介者过于庞大

例子

UML

这里写图片描述

介绍

销售,仓库管理,采购之间的关系处理

代码

AbstractMediator(Mediator)

public abstract class AbstractMediator {    protected Purchase purchase ;     protected Stock stock ;     protected Sale sale ;     public abstract void execute(String str , Object...objects);    public AbstractMediator(){        this.purchase = new Purchase(this) ;         this.sale = new Sale(this) ;         this.stock = new Stock(this) ;     }}

Mediator (ConcreteMediator)

public class Mediator extends AbstractMediator{    @Override    public void execute(String str, Object... objects) {        if("purchase.buy".equals(str)){            this.buyComputer((Integer)objects[0]) ;         }else if("sale.sell".equals(str)){            this.sellComputer((Integer)objects[0]) ;         }else if("sale.offsell".equals(str)){            this.offSell() ;         }else if("stock.clear".equals(str)){            this.clearStock() ;         }       }    private void clearStock() {        super.sale.offSale() ;        super.purchase.refuseBuyIBM();    }    private void offSell() {        System.out.println("折扣销售IBM电脑" + super.stock.getStockNumber() + "台");    }    private void sellComputer(Integer number) {        if(super.stock.getStockNumber() < number){            super.purchase.buyIBMcomputer(number) ;         }        super.stock.decrease(number) ;     }    private void buyComputer(Integer number) {        int saleStatus = super.sale.getSaleStatus() ;         if(saleStatus > 50){            System.out.println("采购电脑" + number + "台");            super.stock.increase(number) ;         }else{            int buyNumber = number/2 ;             super.stock.increase(buyNumber) ;             System.out.println("采购电脑" + buyNumber + "台");        }    }}

AbstractColleague

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

Purchase(Colleague)

public class Purchase extends AbstractColleague{    public Purchase(AbstractMediator mediator) {        super(mediator);    }    public void refuseBuyIBM() {        System.out.println("不在采购IBM电脑");    }    public void buyIBMcomputer(Integer number) {        super.mediator.execute("purchase.buy",number);    }}

Sale(Colleague)

import java.util.Random;public class Sale extends AbstractColleague{    public Sale(AbstractMediator abstractMediator) {        super(abstractMediator) ;     }    public void offSale() {        super.mediator.execute("sale.offsell") ;     }    public int getSaleStatus() {        Random rand = new Random(System.currentTimeMillis()) ;         int status = rand.nextInt(100) ;         System.out.println("IBM电脑的销售情况为" + status);        return status;    }    public void sellIBMComputer(int number){        super.mediator.execute("sale.sell", number);        System.out.println("销售人员销售电脑" + number + "台");    }}

Stock(Colleague)

public class Stock extends AbstractColleague{    private static int CURRENT_NUMBER = 100 ;     public Stock(AbstractMediator abstractMediator) {        super(abstractMediator) ;      }    public int getStockNumber() {        return CURRENT_NUMBER ;     }    public void increase(int number) {        CURRENT_NUMBER = CURRENT_NUMBER + number ;     }    public void decrease(Integer number) {        CURRENT_NUMBER = CURRENT_NUMBER - number ;     }    public void clearStock(){        System.out.println("清理库存数量为:" + CURRENT_NUMBER);        mediator.execute("stock.clear");    }}

Client(client)

public class Client {    public static void main(String[] args) {        AbstractMediator  mediator = new Mediator() ;        System.out.println("======采购人员采购电脑==========");        Purchase purchase = new Purchase(mediator) ;         purchase.buyIBMcomputer(100);        System.out.println("============销售人员销售电脑===============");        Sale sale = new Sale(mediator) ;         sale.sellIBMComputer(50);        System.out.println("==========库房管理人员清理库存=================");        Stock stock = new Stock(mediator) ;         stock.clearStock();    }}

参考

<<设计模式之禅>>

0 0