设计模式(17)之中介者模式

OK,我们先来看一个找对象的例子:

简单说下,Person类的每个实例之间,要发生关系(好猥琐~~~)… 其中,Person类中的抽象方法getPartner()在Man和Woman子类中都有自己的实现,当Man找到Woman且他们的property值相等时,才算配对成功,反之……..

首先,有一个Person抽象类:

//Person.java
package com.wj.ex1;

public abstract class Person {

    private String name;//名字
    private int property;//财产

    public Person(String name, int property) {
        this.name = name;
        this.property = property;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getProperty() {
        return property;
    }
    public void setProperty(int property) {
        this.property = property;
    }

    //找另一半
    public abstract void getPartner(Person person);

}

然后,诞生了一个男孩和一个女孩:

//Man.java
package com.wj.ex1;

public class Man extends Person{

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

    @Override
    public void getPartner(Person person) {
        if(person instanceof Man){
            System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"sorry,我觉得单身挺好...");
        }else if(person instanceof Woman){
            if(this.getProperty() == person.getProperty()){
                System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"ok,咱们在一起吧...");
            }else{
                System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"穷逼,咱们不合适...");
            }
        }else{
            System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"sorry,我不是辣么随便的男孩...");
        }

    }
}
//Woman.java
package com.wj.ex1;

public class Woman extends Person{

    public Woman(String name, int property) {
        super(name, property);
    }

    @Override
    public void getPartner(Person person) {
        if(person instanceof Woman){
            System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"sorry,我觉得单身挺好...");
        }else if(person instanceof Man){
            if(this.getProperty() == person.getProperty()){
                System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"ok,咱们在一起吧...");
            }else{
                System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"穷逼,咱们不合适...");
            }
        }else{
            System.out.println("【"+person.getName()+"】对【"+this.getName()+"】说:"+"sorry,我不是辣么随便的女孩...");
        }
    }

}

然后,这是一个测试类:

//MainClass.java
package com.wj.ex1;

public class MainClass {

    public static void main(String[] args) {

        Person zhangsan = new Man("张三",1000);
        Person lisi = new Man("李四", 2000);

        Person xiaofang = new Woman("小芳", 2000);

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

    }
}


//结果
【小芳】对【张三】说:穷逼,咱们不合适...
【小芳】对【李四】说:ok,咱们在一起吧...

这个狠简单吧~~~

但是,有一天,女孩发现,虽然男孩有钱,但是特么丑啊,生下的小孩也丑啊,虽然有些人是穷逼吧,但是长得帅啊。。。

所以,女孩的择偶标准发生了变化~~~

但是程序员不乐意了,这得要改多少代码啊~~女孩的择偶标准的改变,势必会引起男孩的婚姻状况…归根结底,Man类中的getPartner方法中调用了Woman类,同样Woman类中也调用了Man类。。。这就有点纠缠不清了。。。

要不说程序员是世界上最聪明的一类生物了呢,现在不管你择偶标准怎么变,我给你找一媒婆,有啥要求给媒婆提,,,

所以,这就有了 中介者模式。(你们该不会真的以为中介者模式就是这么来的吧~)

一、什么是中介者模式
Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种。Mediator模式是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。

二、中介者模式的结构
这里写图片描述

三、中介者模式的角色和职责

mediator
中介者类的抽象父类。
concreteMediator
具体的中介者类。
colleague
关联类的抽象父类。
concreteColleague
具体的关联类。

四、中介者模式的优点

1,将系统按功能分割成更小的对象,符合类的最小设计原则

2,对关联对象的集中控制

3,减小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则 ,而Mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)。

4,有利于提高类的重用性

好,现在重写上面的案例:

根据前面的中介者的结构:

//Mediator.java
//中介者接口
package com.wj.ex2;

public abstract class Mediator {

    private Man man;
    private Woman woman;

    public Man getMan() {
        return man;
    }

    public void setMan(Man man) {
        this.man = man;
    }

    public Woman getWoman() {
        return woman;
    }

    public void setWoman(Woman woman) {
        this.woman = woman;
    }

    public abstract void getPartner(Person person);

}
//MeIPoNo1.java
package com.wj.ex2;

/**
 * 天下第一媒
 */
public class MeIPoNo1 extends Mediator{

    @Override
    public void getPartner(Person person) {
        //媒婆先确定介绍的一对的情侣
        if(person instanceof Man){
            this.setMan((Man)person);
        }else if(person instanceof Woman){
            this.setWoman((Woman)person);
        }

        //这里要判断一下,要是设置了同性,即如果设置了俩男孩纸,而没有设置女孩纸的话,那么,在媒婆看来,这是不合法的,因为媒婆只介绍一男一女的~~~像撮合俩男生这种好事,她一般是不会干的~~~
        if(getMan()==null || getWoman() ==null){
            System.out.println("媒婆:Sorry,你们的结合不合法~~~");
        }else{
            if(getMan().getProperty()== getWoman().getProperty()){
                System.out.println("【"+getWoman().getName()+"】对【"+getMan().getName()+"】说:"+"ok,咱们在一起吧...");
            }else{
                System.out.println("【"+getWoman().getName()+"】对【"+getMan().getName()+"】说:"+"丑逼,我们不合适...");
            }
        }

    };

}
//Person.java
package com.wj.ex2;

public abstract class Person {

    private String name;//名字
    private int property;//财产
    private Mediator meditor;//媒婆(中介)

    public Person(String name, int property,Mediator meditor) {
        this.name = name;
        this.property = property;
        this.meditor = meditor;
    }

    public Mediator getMeditor() {
        return meditor;
    }

    public void setMeditor(Mediator meditor) {
        this.meditor = meditor;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getProperty() {
        return property;
    }
    public void setProperty(int property) {
        this.property = property;
    }

    //找另一半
    public abstract void getPartner(Person person);

}
//Man.java
package com.wj.ex2;

public class Man extends Person{

    public Man(String name, int property,Mediator meditor) {
        super(name, property,meditor);
    }

    @Override
    public void getPartner(Person person) {

        this.getMeditor().setMan(this);
        this.getMeditor().getPartner(person);
    }
}
//Woman.java
package com.wj.ex2;

public class Woman extends Person{

    public Woman(String name, int property,Mediator meditor) {
        super(name, property,meditor);
    }

    @Override
    public void getPartner(Person person) {
        this.getMeditor().setWoman(this);
        this.getMeditor().getPartner(person);
    }

}

最后是测试类:

//MainClass.java
package com.wj.ex2;

public class MainClass {

    public static void main(String[] args) {

        Mediator mediator = new MeIPoNo1();//天下第一媒
        Person zhangsan = new Man("张三",7,mediator);//有钱(property=7)但是丑
        Person lisi = new Man("李四",1,mediator);//穷逼(property=1)但是帅
        Person xiaofang = new Woman("小芳",7,mediator);

        zhangsan.getPartner(lisi);//zhangsan + lisi  = gay ,媒婆认为不合法 , 落实到代码处,woman == null

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

//运行结果:
媒婆:Sorry,你们的结合不合法~~~
【小芳】对【张三】说:ok,咱们在一起吧...
【小芳】对【李四】说:丑逼,我们不合适...

代码也是不难理解的啦~~只要你能理解 中介者的结构,就是上面那张图,代码是很容易理解的啦!!!

猜你喜欢

转载自blog.csdn.net/birdflyto206/article/details/53890239