【行为型模式】中介者模式

发布于:2024-04-25 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、中介者模式概述

        中介者模式定义用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(对象行为型模式)

  • 中介者模式的优缺点
    • 优点
      • 1.简化了对象之间的交互;
      • 2.将各同事解耦;
      • 3.减少子类生成;
      • 4.可以简化各同事类的设计和实现。
    • 缺点
      • 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
  • 适用环境
    • 1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
    • 2.一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象;
    • 3.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类
    • 4.我们所常知道的MVC模式中,controller就是我们所谓的中介者。

二、代码实现

中介者模式主要包含4个角色:

  • Mediator: 抽象中介者,是中介者的接口/抽象类;
  • ConcreteMediator: 具体中介者,中介者的具体实现,实现中介者接口,定义一个List来管理Colleague对象;
  • Colleague: 抽象同事类,定义同事类的接口/抽象类,保存中介者对象,实现同事类的公共方法;
  • ConcreteColleague: 具体同事类,实现抽象同事类。通过中介者间接完成具体同事类之间的通信交互。
        2.1 抽象中介者(Mediator)
package Mediator.example;
//抽象中介者
public abstract class Mediator {
	 /**注册同事类*/
    public abstract void register(Colleague colleague);

    /**处理接收逻辑*/
    public abstract void operation(Colleague colleague);
}
        2.2 具体中介者(ConcreteMediator)
package Mediator.example;
import java.util.List;
import java.util.ArrayList;
//具体中介者类
public class ConcreteMediator extends Mediator {

	private List<Colleague> colleagues = new ArrayList<Colleague>();
	@Override
	public void register(Colleague colleague) {
		// TODO Auto-generated method stub
		if (!colleagues.contains(colleague)) {
            colleagues.add(colleague);
            colleague.setMediator(this);
        }
	}

	@Override
	public void operation(Colleague colleague) {
		// TODO Auto-generated method stub
		for (Colleague coll : colleagues) {
            if (!coll.equals(colleague)) {
                coll.receive();
            }
        }
	}

}
        2.3 抽象同事类(Colleague)
package Mediator.example;
//抽象同事类
public abstract class Colleague {
	protected Mediator mediator;

	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}

	public abstract void receive();

	public abstract void send();
}
        2.4 具体同事类(ConcreteColleague1、ConcreteColleague2)
package Mediator.example;
//具体同事类1
public class ConcreteColleague1 extends Colleague {

	@Override
	public void receive() {
		// TODO Auto-generated method stub
		System.out.println("具体同事类 ConcreteColleague1 接收请求");
	}

	@Override
	public void send() {
		// TODO Auto-generated method stub
		System.out.println("具体同事类 ConcreteColleague1 发送请求");
        /*中介者进行转发*/
        mediator.operation(this);
	}

}
package Mediator.example;
//具体同事类2
public class ConcreteColleague2 extends Colleague {

	@Override
	public void receive() {
		// TODO Auto-generated method stub
		System.out.println("具体同事类 ConcreteColleague2 接收到请求");
	}

	@Override
	public void send() {
		// TODO Auto-generated method stub
		 System.out.println("具体同事类 ConcreteColleague2 发送请求");
	     mediator.operation(this);
	}

}
        2.5 客户端(Client)
package Mediator.example;

public class Client {
    public static void main(String[] args) {
        Mediator concreteMediator = new ConcreteMediator();
        Colleague concreteColleague1 = new ConcreteColleague1();
        Colleague concreteColleague2 = new ConcreteColleague2();
        concreteMediator.register(concreteColleague1);
        concreteMediator.register(concreteColleague2);
        concreteColleague1.send();
        concreteColleague2.send();

    }
}
        2.6 UML图

三、代码结构图