admin管理员组

文章数量:1621918

2019独角兽企业重金招聘Python工程师标准>>>

中介者模式

中介者模式(Mediator Pattern)又称为调停者模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,中介者通常处理不同对象之间的通信,使各对象不需要显式地相互引用,从而耦合松散,使代码易于维护。中介者模式属于行为型模式。

什么是中介者模式?

顾名思义,和中介有关。在我们日常生活中,也和中介有着各种各样的联系。比如买房,买车,出国留学,旅游等等。通过直接和中介接触,省去了我们很多麻烦,也提高了办事的效率。

以现实生活中打牌的例子来实现下中介者模式。打牌总有输赢,对应的则是货币的变化,如果不用中介者模式的话,实现如下:

创建对象抽象类:

package com.design_pattern.mediator_pattern;

/**
 * 
 * 抽象对象 这里指抽象的打牌牌友
 * 
 */
public abstract class AbstractCardPartner {
	public int Money;

	public abstract void ChangeMoney(int money, AbstractMediator mediator);
}

创建具体角色实现类:

package com.design_pattern.mediator_pattern;

/**
 * 
 * 具体的牌友A
 * 
 */
public class PartnerA extends AbstractCardPartner {

	@Override
	public void ChangeMoney(int money, AbstractMediator mediator) {
		mediator.AWin(money);

	}

}

 

package com.design_pattern.mediator_pattern;

public class PartnerB extends AbstractCardPartner {

	@Override
	public void ChangeMoney(int money, AbstractMediator mediator) {
		mediator.BWin(money);

	}

}

创建中介者抽象类:

package com.design_pattern.mediator_pattern;

/**
 * 
 * 抽象中介者类
 * 
 */
public abstract class AbstractMediator {
	protected AbstractCardPartner A;
	protected AbstractCardPartner B;

	public AbstractMediator(AbstractCardPartner a, AbstractCardPartner b) {
		A = a;
		B = b;
	}

	public abstract void AWin(int money);

	public abstract void BWin(int money);
}

创建中介者具体实现类

package com.design_pattern.mediator_pattern;

/**
 * 具体中介者
 * 
 */
public class MediatorPater extends AbstractMediator {

	public MediatorPater(AbstractCardPartner a, AbstractCardPartner b) {
		super(a, b);
	}

	@Override
	public void AWin(int money) {
		A.Money += money;
		B.Money -= money;
	}

	@Override
	public void BWin(int money) {
		B.Money += money;
		A.Money -= money;

	}

}

创建使用者:

package com.design_pattern.mediator_pattern;

public class Main {
	public static void main(String[] args) {
		AbstractCardPartner A = new PartnerA();
		AbstractCardPartner B = new PartnerB();
		A.Money = 20;
		B.Money = 20;

		AbstractMediator mediator = new MediatorPater(A, B);

		// A赢了
		A.ChangeMoney(5, mediator);
		System.out.println("A赢了5元---" + A.Money + ": " + B.Money);

		// B赢了
		B.ChangeMoney(10, mediator);
		System.out.println("B赢了10元---" + A.Money + ": " + B.Money);
	}
}

输出结果:

A赢了5元---25: 15
B赢了10元---15: 25

从上面的例子可以看出,中介者类,持有所有需要互相通信的对象。并且需要互相通信的对象,在彼此进行交互,更改彼此状态的时候,没有直接互相调用,而是都持有一个中介者类对象,调用了中介者的方法,由中介者执行对象状态的变更。

 

在上面的实现代码中,抽象中介者类保存了两个抽象牌友类,如果新添加一个牌友类似时,此时就不得不去更改这个抽象中介者类。可以结合观察者模式来解决这个问题,即抽象中介者对象保存抽象牌友的类别,然后添加Register和UnRegister方法来对该列表进行管理,然后在具体中介者类中修改AWin和BWin方法,遍历列表,改变自己和其他牌友的钱数。这样的设计还是存在一个问题——即增加一个新牌友时,此时虽然解决了抽象中介者类不需要修改的问题,但此时还是不得不去修改具体中介者类,即添加CWin方法,我们可以采用状态模式来解决这个问题,关于状态模式的介绍将会在下一篇进行介绍。

中介者模式的优缺点

优点:

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

缺点:

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

中介者模式的适用场景

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

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

 

 

转载于:https://my.oschina/xiaoyoung/blog/2995115

本文标签: 模式中介