JAVA设计模式(十六)——中介者模式

1、中介者模式

        Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种。

        Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。中介者模式的核心思想就是两个对象尽可能不要直接相关,而是通过中介者联系。


2、结构图示

我们先看看中介者模式的结构图,如下:



3、角色职责

显然,中介者模式必然会有两种大的角色分类,一个是中介者,一个是我们的普通类,而两个分别面向抽象,应对接口,那么就会有四种对象,如下:

MMediator: 抽象中介者。定义了同事对象到中介者对象之间的接口。

ConcreteMediator:具体中介者。实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体的同事类那里接收信息,并且向具体的同事类发送信息。

Colleague: 抽象同事类。

ConcreteColleague:具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。


4、源码示例

先来一个抽象的同事类,如下:

 /**
  * 抽象类:人类
  * @author ljtyzhr
  *
  */
public abstract class Person {  
      
    private String name;  
    private int condition;  
    private Mediator mediator;  
      
    public Person(String name, int condition, Mediator mediator) {  
        this.name = name;  
        this.condition = condition;  
        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 Mediator getMediator() {  
        return mediator;  
    }  
    public void setMediator(Mediator mediator) {  
        this.mediator = mediator;  
    }  
      
    public abstract void getPartner(Person person);  
      
} 

然后是两个抽象类的示例化对象,他们就是中介者需要沟通的两个对象,如下:

/**
 * 女人类
 * 
 * @author ljtyzhr
 *
 */
public class Woman extends Person {  
  
    public Woman(String name, int condition, Mediator mediator) {  
        super(name, condition, mediator);  
    }  
  
    //1、中介注册  2、中介匹配  
    public void getPartner(Person person) {  
        this.getMediator().setWoman(this);  
        this.getMediator().getPartner(person);  
    }  
  
}  

/**
 * 男人类
 * 
 * @author ljtyzhr
 *
 */
public class Man extends Person {  
  
    public Man(String name, int condition, Mediator mediator) {  
        super(name, condition, mediator);  
    }  
  
    //1、中介注册  2、中介匹配  
    public void getPartner(Person person) {  
        this.getMediator().setMan(this);  
        this.getMediator().getPartner(person);  
    }  
  
}

最后是我们的中介者的抽象与实现,这里为了简便起见,就不再给出抽象类了,直接是一个实现类对象:

/**
 * 中介者:这里本应该是一个抽象类
 * @author ljtyzhr
 *
 */
public 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(this.man == null || this.woman == null)  
            System.out.println("汗,我不是同性恋");  
        else{  
            if(this.man.getCondition() == this.woman.getCondition())  
                System.out.println(this.man.getName() + "和" + this.woman.getName() + "绝配");  
            else  
                System.out.println(this.man.getName() + "和" + this.woman.getName() + "不相配");  
        }  
    }  
} 


5、结果分析

测试类,如下:

/**
 * 测试案例类
 * @author ljtyzhr
 *
 */
public class MainClass {  
  
    public static void main(String[] args) {  
        Mediator mediator = new Mediator();  
          
        Person zhangsan = new Man("张三", 3, mediator);  
        Person lisi = new Man("李四", 1, mediator);  
        Person xiaofang = new Woman("小芳", 3, mediator);  
          
        zhangsan.getPartner(lisi);  
        zhangsan.getPartner(xiaofang);  
        lisi.getPartner(xiaofang);  
    }  
}  

对应的结果如下:

汗,我不是同性恋
张三和小芳绝配
李四和小芳不相配


6、模式总结

        这里,我们没有直接让男人和女人直接联系,去判断是否合适,而是把这种判断交给了中介者,由中介者根据一定的规则匹配,得到结果。比如这里的规则就是,同性之间不能匹配,如果不是同性,有更多的相同点就是匹配的。

        当然,这里的匹配规则是非常简单的,我们这里也仅仅是举例说明一下而已,读者应该能够自己举一反三。比如常见的,房屋中介,留学中介等等。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值