六、中介者模式Mediator(行为型模式)

简述

调停者模式(Mediator pattern)软件设计模式的一种,用于模块间解耦,通过避免对象互相显式的指向对方从而降低耦合。

整合核心于决策核心

主板式汇集众多接口的整合体,其中最特殊的接口是它于CPU之间的接口,如图:

CPU本身包容了非常复杂的运算逻辑,而MB又通过接口将它包容进来,展现MB的极大包容力,而且至今MB的包容力仍然日益增强钟。
这种结构并不局限于硬件上,软件上也很常见:



Mediator=整合核心+决策核心

问题

① 多个对象重复访问,无规律性。
② 一个对象集合的交互良好定义,但是交互方式复杂。通常有非结构依赖。
③ 对象复用困难,因为对象指向和交互很多其他的对象
④ 在多个类之间的分布式行为的控制问题:应该不用建立很多子类就是先本地化

参与者说明

Mediator: 定义了与colleague对象交互的接口,通常被告知事件或者状态
concreteMediator:实现与colleague交互的具体行为,了解和维护colleagues
③ colleague: 每个colleague知道自己的Mediator对象,每个colleague当其需要与其他colleague交互时需要先与自己的mediator进行交互,为mediator提供了服务,colleague可能请求相同也可能不同

结果

① 定义对象,其封装了一组对象的交互方式
② Mediator促进低耦合,通过纺织对象显示的引用彼此;
③ 让人独立的拓展其交互 集中式控制

Colleague抽象类别定义了mediator指针可以参考到Mediator类别体系的对象。而ConcreteColleague1、 ConcreteColleague2等类别都继承了这mediator指针,因此ConcreteColleague1、ConcreteColleague2等类别的对象可以接着mediator指针而传送讯息给Mediator的对象。


应用    

一、在Android开发中Activity一般就适合担任协调者的角色,如图:

ac01扮演了整个View间的互动与合作的协调者。

二、Android的Binder Kernel:










Demo

未运用中介模式前的实现:
abstract class Person {

   private String name;

   private int condition;

   public Person(String name, int condition) {

      this.name = name;

      this.condition = condition;
   }

   public String getName() {

      return name;
   }

   public void setName(String name) {

      this.name = name;
   }

   public int getCondition() {

      return condition;
   }

   public void setCondition(int condition) {

      this.condition = condition;
   }

   public abstract void getPartner(Person person);
}

class Man extends Person {

   public Man(String name, int condition) {
      super(name, condition);
   }

   public void getPartner(Person person) {
      if (person instanceof Man) {

        System.out.println("汗,我不是同性恋!");
      } else {
        if (this.getCondition() == person.getCondition()) {
           System.out.println(this.getName() + "和" + person.getName()
                 + "绝配");
        } else {
           System.out.println(this.getName() + "和" + person.getName()
                 + "不相配");
        }
      }
   }
}

class Woman extends Person {

   public Woman(String name, int condition) {

      super(name, condition);
   }

   public void getPartner(Person person) {

      if (person instanceof Woman) {
        System.out.println("汗,我不是同性恋!");
      } else {
        if (this.getCondition() == person.getCondition()) {
           System.out.println(this.getName() + "和" + person.getName()
                 + "绝配");
        } else {
           System.out.println(this.getName() + "和" + person.getName()
                 + "不相配");
        }
      }
   }
}

public class Test {

   public static void main(String[] args) {
      Person zhangsan = new Man("张三", 5);
      Person lisi = new Man("李四", 6);
      Person xiaofang = new Woman("小芳", 6);
      zhangsan.getPartner(xiaofang);
      lisi.getPartner(xiaofang);
      zhangsan.getPartner(lisi);
      /*张三和小芳不相配

      李四和小芳绝配

      汗,我不是同性恋!*/
   }
}
运用了中介模式的代码:
class Mediator {

   private Man man;

   private Woman woman;

   public void setMan(Man man) {

      this.man = man;
   }

   public void setWoman(Woman woman) {

      this.woman = woman;
   }

   public void getPartner(Person person) {
      // 将搭档设置上
      if (person instanceof Man) {
        this.setMan((Man) person);
      } else {
        this.setWoman((Woman) person);
      }
      // 判断条件
      if (man == null || woman == null) {
        System.out.println("汗,我不是同性恋!");
      } else {
        if (man.getCondition() == woman.getCondition()) {
           System.out.println(man.getName() + "和" + woman.getName() + "绝配");
        } else {
           System.out.println(man.getName() + "和" + woman.getName()+ "不相配");
        }
      }
   }
}



abstract class Person {

   private String name;
   private int condition;
   private Mediator mediator;

   public Person(String name, int condition, Mediator mediator) {
      super();
      this.name = name;
      this.condition = condition;
      this.mediator = mediator;
   }

   public Mediator getMediator() {
      return mediator;
   }

   public void setMediator(Mediator mediator) {
      this.mediator = mediator;
   }
   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }
   public int getCondition() {
      return condition;
   }

   public void setCondition(int condition) {
      this.condition = condition;
   }
   public abstract void getPartner(Person person);

}

class Man extends Person {

   public Man(String name, int condition, Mediator mediator) {

      super(name, condition, mediator);
   }

   public void getPartner(Person person) {
      this.getMediator().setMan(this);
      this.getMediator().getPartner(person);
   }

}

class Woman extends Person {
   public Woman(String name, int condition, Mediator mediator) {
      super(name, condition, mediator);
   }

   public void getPartner(Person person) {
      this.getMediator().setWoman(this);
      this.getMediator().getPartner(person);
   }

}

public class Test {

   public static void main(String[] args) {

      Mediator mediator = new Mediator();
      Person zhangsan = new Man("张三", 7, mediator);
      Person lisi = new Man("李四", 7, mediator);
      Person xiaofang = new Woman("小芳", 7, mediator);

      zhangsan.getPartner(xiaofang);
      lisi.getPartner(xiaofang);
      zhangsan.getPartner(lisi);

      /*
       * 张三和小芳绝配 李四和小芳绝配 李四和小芳绝配
       */

   }

}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值