• 设计模式_中介者模式



    定义
    Define an object that encapsulates how a set of objects interact.  Mediator promptes loose coupling by keeping objects from referring to each other explicitly,and it lets you vary their interaction independently.(用一个中介对象封装一系列的对象交互。中介者使各对象不须要显示地相互作用。从而使其耦合松散,并且能够独立地改变它们之间的交互) 

    不认识的单词
    encapsulates: 
    a set of :一系列
    interact:
    loose: 
    coupling: 耦合
    referring :
    explicitly:明白地,明白地
    vary:

    举例
    比如以下的图

    採购管理,销售管理,存货管理.....多个模块之间有交流,假设须要维护改动什么的。谁愿意去当那个程序员?   


    依据网络拓扑结构,有三种类型。总线型。环形,星型。 



    依据这个设计出例如以下


    类图 


    分析类图:三个子模块继承AbstractColleague,Mediator继承AbstractMediator,其父类有三个子模块的实例。另一个统一处理的execute方法()。完毕特定的任务。须要三个子模块中独立的方法。

     

    public abstract class AbstractColleague {
     
     protected AbstractMediator mediator; //为何是protected:仅仅对子类公开
     
     public AbstractColleague(AbstractMediator mediator){
      this.mediator=mediator;
     }
    }

    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 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电脑");
     }
    }
    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("销售电脑:"+number+"台");
     }
     
     //反馈,0~100变化
     public int getSaleStatus(){
      Random rand=new Random(System.currentTimeMillis());
      int saleStatus=rand.nextInt(100);
      System.out.println("IBM电脑的销售情况为:"+saleStatus);
      return saleStatus;
     }
     public void offSale(){
      super.mediator.execute("sale.offsell");
     }
    }

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

    中介者,处理复杂的业务。调用三个同事中一个或多个方法。
    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.sellComputer((Integer)objects[0]);
      }else if(str.equals("sale.offsell")){  //折价销售
       this.offSell();
      }else if(str.equals("stock.clear")){  //清仓处理
       this.clearStock();
      }
     }
     private void buyComputer(Integer number) {
      int saleStatus=super.sale.getSaleStatus();
      if(saleStatus>80){	 //销售状态好
       System.out.println("採购IBM电脑:"+number+"台");
       super.stock.increase(number);
      }else{	 //销售状态不好
       int buyNumber=number/2;
       System.out.println("採购IBM电脑:"+buyNumber+"台");
      }
     }
     private void sellComputer(Integer number) {
      if(super.stock.getStockNumber()<number){ //库存不足不够销售
       super.purchase.buyIBMcomputer(number);
      }
      super.stock.decrease(number);
     }
     //折价销售
     private void offSell() {
      System.out.println("折价销售IBM电脑"+stock.getStockNumber()+"台");
     }
     //清仓处理
     private void clearStock() {
      super.sale.offSale();
      super.purchase.refuseBuyIBM();
     }
    }

    測试

    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(1);
      System.out.println("------------库房管理人员清库处理--------------");
      Stock stock=new Stock(mediator);
      stock.clearStock();
     }

    说明 

     public abstract void execute(String str,Object...objects);  可变參数数组,详细可訪问 http://blog.csdn.net/testcs_dn/article/details/38920323

    悟:多个模块之间有耦合,须要交流时,业务写的非常杂非常乱,这时候须要一个中介来管理麻烦事。


    通用写法

    public abstract class Mediator {
    //定义同事类
    protected ConcreteColleague1 c1;
    protected ConcreteColleague2 c2;
    //通过getter/setter方法把同事类注入进来
    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 abstract void doSomething1();
    public abstract void doSomething2();
    }


    public abstract class Colleague {
    protected Mediator mediator;
    public Colleague(Mediator _mediator){
    this.mediator = _mediator;
    }
    }


    public class ConcreteMediator extends Mediator {
    @Override
    public void doSomething1() {
    //调用同事类的方法,仅仅要是public方法都能够调用
    super.c1.selfMethod1();
    super.c2.selfMethod2();
    }
    public void doSomething2() {
    super.c1.selfMethod1();
    super.c2.selfMethod2();
    }
    }


    public class ConcreteColleague1 extends Colleague {
    //通过构造函数传递中介者
    public ConcreteColleague1(Mediator _mediator){
    super(_mediator);
    }
    //自有方法 self-method
    public void selfMethod1(){
    //处理自己的业务逻辑
    }
    //依赖方法 dep-method
    public void depMethod1(){
    //处理自己的业务逻辑
    //自己不能处理的业务逻辑,托付给中介者处理
    super.mediator.doSomething1();
    }
    }

    各个同事单一的任务,各干各的事,而中介者ConcreteMediator 这个项目经理须要调动各部分完毕一件事。

    长处

        降低了耦合,降低了依赖

    缺点
        同事类越多。越复杂,适合小系统

    使用场景
        在类图中出现了蜘蛛网网状结构

    实际应用举例
        机场调度中心
        MVC框架: C(Controller) 就是一个中介者,前端控制器,就是把M(Model,业务逻辑)和V(Viw,视图)隔离开 
        中介服务 

    同事 :  abstract  
    兄弟 :  interface
    这个比喻有点逗

    我是菜鸟,我在路上。

  • 相关阅读:
    打开安装 好的Microsoft Dynamics CRM 4.0 报错误为 Caller does not have enough privilege to set CallerOriginToken to the specified value 的解决办法
    基于 Windows Server 2008 的计算机对 Microsoft Dynamics CRM 4.0 的支持
    Microsoft Dynamics CRM 4.0 如何添加自定义按钮
    Microsoft Dynamics CRM 4.0 Plugin 取值,赋值,查询
    C# 中的 enum(枚举) 类型使用例子
    vue事件的绑定
    表单验证2
    node中模块
    node模块的引入
    node中的读文件
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6932737.html
Copyright © 2020-2023  润新知