【设计模式】中介者模式

版权声明:转载请注明出处: https://blog.csdn.net/qq_21687635/article/details/85208858

模式定义

中介者模式来集中相关对象之间复杂的沟通和控制方式。

下图是该模式的类图:
中介者模式类图

使用中介者之前,各个对象之间相互依赖,如下图所示:
使用中介者之前

使用中介者模式之后,各个对象之间的联系让中介者解耦了,如下图所示:
使用中介者模式后

一个生动的例子

假如有个人喜欢另一个人,但是他不敢直接告诉那个人,所以他就想找个中间人把消息告诉这个中间人,然后再由中间人把这个消息告诉他喜欢的那个人。这个中间人的角色就是中介者。

Mediator抽象类:
public abstract class Mediator {
	abstract void contact(String content, Person person);
}

Mediator具体类:
class ConcreteMediator extends Mediator {
	Male male;
	Female female;

	@Override
	public void contact(String content, Person person) {
		if (person == male) {
			female.getMessage(person, content.replace("我", "他"));
		} else {
			male.getMessage(person, content.replace("我", "她"));
		}
	}

	public Male getMale() {
		return male;
	}

	public void setMale(Male male) {
		this.male = male;
	}

	public Female getFemale() {
		return female;
	}

	public void setFemale(Female female) {
		this.female = female;
	}
}
Colleague类:
public class Person {
	protected String name;
	protected Mediator mediator;

	public Person(String name, Mediator mediator) {
		this.name = name;
		this.mediator = mediator;
	}

	public String getName() {
		return name;
	}
}

Colleague具体类:
class Male extends Person {
	public Male(String name, Mediator mediator) {
		super(name, mediator);
	}

	public void getMessage(Person person, String message) {
		System.out.println(name + ":" + person.getName() + "她说" + message);
	}

	public void contact(String message) {
		mediator.contact(message, this);
	}
}

Colleague具体类:
class Female extends Person {
	public Female(String name, Mediator mediator) {
		super(name, mediator);
	}

	public void getMessage(Person person, String message) {
		System.out.println(name + ":" + person.getName() + "他说" + message);
	}

	public void contact(String message) {
		mediator.contact(message, this);
	}
}
测试类/客户端类:
public class MediatorTest {
	public static void main(String[] args) {
		ConcreteMediator mediator = new ConcreteMediator();
		Male male = new Male("张三", mediator);
		Female female = new Female("翠花", mediator);
		
		mediator.setMale(male);
		mediator.setFemale(female);
		
		male.contact("我喜欢你!");
		female.contact("我不喜欢你,滚!");
	}
}

参考

  1. Head First 设计模式[书籍]
  2. 博客园之中介者模式

猜你喜欢

转载自blog.csdn.net/qq_21687635/article/details/85208858
今日推荐