Java设计模式——中介者模式

Java设计模式之中介者模式

中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

角色:

  • Mediator(抽象中介者):该接口用于与各同事对象之间进行通信。
  • ConcreteMediator(具体中介者):它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。
  • Colleague(抽象同事类):它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
  • ConcreteColleague(具体同事类):它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信。

使用

一个相亲中介所负责处理相亲者的约会请求和被约会对象的回应。

如果让他们各自联系并进行约会,耗时长,还混乱,所以我们使用中介者模式

  • Mediator 中介类
/**
 * 中介者抽象类
 */
public abstract class Mediator {
    public abstract void register(DatingPerson person);//注册到中介所
    public abstract void response(String datingPerson,String datedPerson);//回应相亲对象的是否接受
}
  • DatingPerson 相亲的人 同事抽象类
/**
 * 相亲的人抽象类
 */
public abstract class DatingPerson {
    protected Mediator mediator;//保存中介所的引用
    protected String name;//名字
    public String getName(){
        return name;
    }
    //相亲操作,调用的对象与传入参数名字的人发起约会请求,中介所处理,都相同所以写在抽象类实现中
    public void makeOneDate(String datePersonName){
        System.out.println("我想和 "+datePersonName+" 约个会");
        mediator.response(this.getName(),datePersonName);
    }
    //接受
    public void accept(String name){
        System.out.println("我接受这次和 "+name+" 约会\n");
    }
    //拒绝
    public void refuse(String name) {
        System.out.println("我不想和 "+name+" 约会\n");
    }
}
  • PersonA 具体同事类

创建时调用构造方法传入中介所并注册

public class PersonA extends DatingPerson {
    public PersonA(Mediator mediator) {
        this.mediator = mediator;
        name = "a";
        this.mediator.register(this);
    }
}
  • PersonB 具体同事类
public class PersonB extends DatingPerson {
    public PersonB(Mediator mediator) {
        this.mediator = mediator;
        name = "b";
        this.mediator.register(this);
    }
}
  • PersonC 具体同事类
public class PersonC extends DatingPerson{
    public PersonC(Mediator mediator){
        this.mediator = mediator;
        name = "c";
        this.mediator.register(this);
    }
}
  • PersonD 具体同事类
public class PersonD extends DatingPerson{
    public PersonD(Mediator mediator){
        this.mediator = mediator;
        name = "d";
        this.mediator.register(this);
    }
}
  • DateMediator 相亲中介所 中介实现类
/**
 * 相亲中介所
 */
public class DateMediator extends Mediator{
    private Map<String,DatingPerson> datingPeople;//存放所有要相亲的人
    public DateMediator(){
        datingPeople = new HashMap<>();
    }
    //把要相亲的人注册到中介所
    public void register(DatingPerson person) {
        datingPeople.put(person.getName(),person);
    }
    //回应约会请求
    @Override
    public void response(String datingPerson,String datedPerson) {
        DatingPerson person = datingPeople.get(datedPerson);//获取被约会对象
        if(datingPerson.equals("c")){//所有人都不想和c约会
            person.refuse(datingPerson);//被约会对象拒绝
        }else {
            person.accept(datingPerson);//被约会对象接受
        }
    }
}
  • 测试
public class ClientTest {
    public static void main(String[] args) {
        Mediator mediator = new DateMediator();
        DatingPerson a = new PersonA(mediator);
        DatingPerson b = new PersonB(mediator);
        DatingPerson c = new PersonC(mediator);
        DatingPerson d = new PersonD(mediator);
        a.makeOneDate("c");
        b.makeOneDate("d");
        c.makeOneDate("d");
        d.makeOneDate("a");
    }
}


输出:
我想和 c 约个会
我接受这次和 a 约会

我想和 d 约个会
我接受这次和 b 约会

我想和 d 约个会
我不想和 c 约会

我想和 a 约个会
我接受这次和 d 约会

MVC模式中Controller就是中介者

中介者模式优点:

  • 同事间的解耦,他们只需要保存中介者的引用
  • 同事间传递消息变得简单,系统易于维护

代码地址:Github中介者模式


Java设计模式|策略模式

Java设计模式|观察者模式

Java设计模式|装饰者模式

Java设计模式|工厂模式

Java设计模式|命令模式

Java设计模式|适配器模式和外观模式

Java设计模式|模板方法模式

Java设计模式|迭代器模式和组合模式

Java设计模式|状态模式

Java设计模式|代理模式

Java设计模式|单例模式

Java设计模式|备忘录模式

Java设计模式|访问者模式

Java设计模式|复合模式

Java设计模式|桥接模式

Java设计模式|生成器模式

Java设计模式|享元模式/蝇量模式

Java设计模式|原型模式

Java设计模式|责任链模式

Java设计模式|中介者模式

  • 本文作者: dzou | 微信:17856530567
  • 本文链接: http://www.dzou.top/post/6c0cb1a1.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
  • 并保留本声明和上方二维码。感谢您的阅读和支持!