zoukankan      html  css  js  c++  java
  • 设计模式_中介者模式


    定义
    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
    这个比喻有点逗

    我是菜鸟,我在路上。

  • 相关阅读:
    c语言中逆向显示数值
    c语言中无限循环语句
    css静态网页css代码
    css静态网页css代码
    考试html代码
    考试css代码
    考试html框架代码
    css静态网页代码
    5个CSS书写技巧
    5个CSS书写技巧
  • 原文地址:https://www.cnblogs.com/wzzkaifa/p/6932737.html
Copyright © 2011-2022 走看看