Java设计模式之中介者模式

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

这个模式我们可以简单的类比于星型结构,中介者就是中心,其他对象的交互都是通过中心的中介者作为媒介,而不是直接交互,这样就避免了对象直接交互导致的关系混乱,不易维护的缺点。

UML图如下: 

这里写图片描述

abstract class Mediator //抽象中介者类
{
    public abstract void Send(String message,Colleague colleague)
}

//抽象同事类
abstract class Colleague
{
    protected Mediator mediator;
    public Colleauge(Mediator mediator)
    {
        this.mediator = mediator;
    }
}

//具体中介者类 
class ConcreteMediator extends Mediator
{
        private ConcreteColleague1 concreteColleague1;
	private ConcreteColleague2 concreteColleague2;


	@Override
	public void send(String message, Colleague colleague) {
		if(colleague==concreteColleague1) {
			concreteColleague2.doNotify(message);
		}else {
			concreteColleague1.doNotify(message);
		}
		
	}


	public ConcreteColleague1 getConcreteColleague1() {
		return concreteColleague1;
	}


	public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
		this.concreteColleague1 = concreteColleague1;
	}


	public ConcreteColleague2 getConcreteColleague2() {
		return concreteColleague2;
	}


	public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
		this.concreteColleague2 = concreteColleague2;
	}
}

//具体同事类  ConcreteColleague2类似 
class ConcreteColleague1 extends Colleague
{
    public ConcreteColleague1(Mediator mediator){
        super(mediator);
    }
    public void send(string message)
    {
        mediator.send(message,this);
    }
    public void doNotify(String message)
    {
        System.out.println(message+",同事1收到消息");
    }
}
class ConcreteColleague2 extends Colleague
{
    public ConcreteColleague2(Mediator mediator){super(mediator);}
    public void send(String message)
    {
        mediator.send(message,this);
    }
    public void doNotify(String message)
    {
        System.out.println(message+",同事2收到消息");
    }
}
//测试
public static void Main(String[] args)
{
    ConcreteMediator mediator = new ConcreteMediator();
    ConcreteColleague1 c1 = new ConcreteColleague1(mediator);
    ConcreteColleague2 c2 = new ConcreteColleague2(mediator);
    mediator.setConcreteColleague1(c1);
    mediator.setConcreteColleague2(c2);
		
    c1.send("同事1发送消息一;");
    c2.send("同事2发送消息二;");
}

中介者模式的优缺点

优点:

  • 简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变为松耦合。
  • 提供系统的灵活性,使得各个同事对象独立而易于复用。

缺点:

  • 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
  • 新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

中介者模式的适用场景

以下情况下可以考虑使用中介者模式:

  • 一组定义良好的对象,现在要进行复杂的相互通信。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。


猜你喜欢

转载自blog.csdn.net/u011109589/article/details/80224528