行为型模式之中介模式

中介模式Mediator

如果一个系统中对象之间呈现网状结构,关系复杂,则可以引入一个中介者对象,由中介者和其他对象打交道。

1.使用场景

假设没有总经理,有三个部门,财务部,调研部,研发部。财务部要发工作,要通知调研部和研发部,调研部调研需要财务支持和研发部支持。每个部门之间都要打交道。关系非常乱。实际上,每个公司都要总经理,每个部门有什么事都报道到总经理这里,总经理在通知相关部门。
这就是典型的中介者模式,总经理起到一个中介协调的作用。

  1. 通过让对象彼此解耦,增加对象的复用性
  2. 通过将控制逻辑集中,可以简化系统维护

2.组成

• 抽象中介者(Mediator): 定义了同事对象到中介者对象之间的接口。
• 具体中介者(ConcreteMediator): 实现抽象中介者的方法,它需要知道所有的具体同事类,同时需要从具体 的同事类那里接收信息,并且向具体的同事类发送信息。
• 抽象同事类(Colleague): 定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
• 具体同事类(ConcreteColleague) : 每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。

3.

package com.liang.mediator;
import java.util.HashMap;
import java.util.Map;

/**
 *经理
 *抽象中介者(Mediator)和具体中介者(ConcreteMediator)类,把部门存储到map中便于调用
 */
public interface Mediator {
	void receiveReq(String dname);
	void regiset(String dname,Department d);
}

class Manager implements Mediator{
	private Map<String,Department> map=new HashMap<>();
	@Override
	public void receiveReq(String dname) {
		// TODO 自动生成的方法存根
		map.get(dname).dealThings();
	}

	@Override
	public void regiset(String dname, Department d) {
		map.put(dname, d);
	}
	
}


package com.liang.mediator;
/**
 *部门
  * 抽象同事类(Colleague)和具体同事类
 */
public interface Department {
	void outReq();
	void dealThings();
}
class A implements Department{
	private Mediator m;
	
	public A(Mediator m) {
		super();
		this.m = m;
		m.regiset("A",this);
	}

	@Override
	public void outReq() {
		// TODO 自动生成的方法存根
		System.out.println("需要得到B部门的支持");
		m.receiveReq("B");
	}

	@Override
	public void dealThings() {
		// TODO 自动生成的方法存根
		System.out.println("调研部");
	}
	
}
class B implements Department{
	private Mediator m;
	
	public B(Mediator m) {
		super();
		this.m = m;
		m.regiset("B",this);
	}
	
	@Override
	public void outReq() {
		// TODO 自动生成的方法存根
		System.out.println("需要得到C部门的支持");
		m.receiveReq("C");
	}
	
	@Override
	public void dealThings() {
		// TODO 自动生成的方法存根
		System.out.println("财务部:发钱");
	}
	
}

package com.liang.mediator;
public class Client {
	public static void main(String[] args) {
		Mediator manager=new Manager();
		
		Department a=new A(manager);
		Department b=new B(manager);
		
		a.dealThings();
		a.outReq();
		
	}
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值