设计模式的学习(13)中介者模式

中介者模式

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

什么是中介者模式?ide

顾名思义,和中介有关。在咱们平常生活中,也和中介有着各类各样的联系。好比买房,买车,出国留学,旅游等等。经过直接和中介接触,省去了咱们不少麻烦,也提升了办事的效率。spa

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

建立对象抽象类:code

package com.cn.design_pattern.mediator_pattern;

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

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

建立具体角色实现类:对象

package com.cn.design_pattern.mediator_pattern;

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

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

	}

}

 

package com.cn.design_pattern.mediator_pattern;

public class PartnerB extends AbstractCardPartner {

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

	}

}

建立中介者抽象类:blog

package com.cn.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);
}

建立中介者具体实现类class

package com.cn.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.cn.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方法,咱们能够采用状态模式来解决这个问题,关于状态模式的介绍将会在下一篇进行介绍。

中介者模式的优缺点

优势:

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

缺点:

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

中介者模式的适用场景

如下状况下能够考虑使用中介者模式:

  • 一组定义良好的对象,如今要进行复杂的相互通讯。
  • 想经过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
相关文章
相关标签/搜索