设计模式——中介者

1.定义

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

2.使用场景

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

例如:1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

3.实现

/**
 * 抽象同事类:规定了具体同事需要实现的方法
 * @author Administrator
 *
 */
public abstract class Colleague {
	protected String name;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public Colleague(String name) {
		this.name = name;
	}
	
	public abstract void sendMessage(Mediator mediator,String message);
	
	public abstract String receiveMessage(String message);
	
}
/**
 * 中介者接口:定义一个接口用于各同事(Colleague)之间的通信
 * @author Administrator
 *
 */
public interface Mediator {
	void deliverMessage(Colleague colleague,String message);
}
/**
 * 具体同事类:实现抽象类的方法,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
 * @author Administrator
 *
 */
public class ColleagueA extends Colleague{

	public ColleagueA(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void sendMessage(Mediator mediator, String message) {
		// TODO Auto-generated method stub
		mediator.deliverMessage(this, message);
	}

	@Override
	public String receiveMessage(String message) {
		// TODO Auto-generated method stub
		System.out.println("我的名字:"+super.name+",收到消息:"+message);
		return null;
	}

}
/**
 * 具体同事类:实现抽象类的方法,每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者。
 * @author Administrator
 *
 */
public class ColleagueB extends Colleague{

	public ColleagueB(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void sendMessage(Mediator mediator, String message) {
		// TODO Auto-generated method stub
		mediator.deliverMessage(this, message);
	}

	@Override
	public String receiveMessage(String message) {
		// TODO Auto-generated method stub
		System.out.println("我的名字:"+super.name+",收到消息:"+message);
		return null;
	}

}
/**
 * 具体中介者:具体中介者,实现抽象中介者的方法,具体中介者需要包含所有具体同事(ConcreteColleague)的引用,并通过实现中介者接口中的方法来满足具体同事之间的通信要求;
 * @author Administrator
 *
 */
public class ConcreteMediator implements Mediator{
	private Colleague colleagueA;
	private Colleague colleagueB;
	
	public ConcreteMediator(Colleague colleagueA,Colleague colleagueB) {
		this.colleagueA = colleagueA;
		this.colleagueB = colleagueB;
	}

	@Override
	public void deliverMessage(Colleague colleague, String message) {
		// TODO Auto-generated method stub
		if(colleague==colleagueA) {//如果是A发来的消息,那么通知B
			colleagueB.receiveMessage(message);
		}else if(colleague==colleagueB) {//如果是B发来的消息,那么通知A
			colleagueA.receiveMessage(message);
		}
	}

}
/**
 * 测试类
 * @author Administrator
 *
 */
public class Test {
	public static void main(String[] args) {
		Colleague colleagueA = new ColleagueA("客户");
		Colleague colleagueB = new ColleagueB("商家");
		
		Mediator mediator = new ConcreteMediator(colleagueA,colleagueB);
		
		colleagueA.sendMessage(mediator, "我需要一份三明治");
		colleagueB.sendMessage(mediator, "这里有各种各样的三明治");
	}
}

运行结果:

在这里插入图片描述

4.总结

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
缺点: 中介者会庞大,变得复杂难以维护。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值