中介者模式

定义:

       定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者又叫调停模式,它是迪米特法则的典型应用。

适用场景:

       1、当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。

       2、当想创建一个运行于多个类之间的对象,又不想生成新的子类时。

优点:

       1、降低了对象之间的耦合性,使得对象易于独立地被复用。

       2、将对象间的一对多关联转变为一对一的关联,提高系统的灵活性,使得系统易于维护和扩展。

缺点:

       1、当同事类太多时,中介者的职责将很大,它会变得复杂和庞大,以至于系统难以维护。

组成元素:

       1、抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。

       2、具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个List来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。

       3:抽象同事(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。

       4、具体同事类(ConcreteColleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

类图如下:

抽象代码实现:

       1、定义抽象中介者Mediator:

public interface Mediator {

	public void register(Colleague colleague);
	
	public void relay(Colleague colleague);
}

       2、定义具体中介者ConcreteMediator:

public class ConcreteMediator implements Mediator{

	private List<Colleague> colleagueList = new ArrayList<Colleague>();

	@Override
	public void register(Colleague colleague) {
		if(!colleagueList.contains(colleague)){
			colleagueList.add(colleague);
			colleague.setMediator(this);
		}
	}
	
	/*当有同事发出请求时,其他的同事可以接收到请求*/
	@Override
	public void relay(Colleague colleague) {
		for(Colleague ob:colleagueList){
			if(!ob.equals(colleague)){
				((Colleague)ob).receive();
			}   
		}
	}
}

       3、定义抽象同事Colleague:

public  abstract class Colleague {

	public  Mediator mediator;
	
	public abstract void receive();
	
	public abstract void send();

	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}
}

       4、定义具体同事类ConcreteColleagueAConcreteColleagueB:

public class ConcreteColleagueA extends Colleague{

	@Override
	public void receive() {
	    System.out.println("具体同事类A收到请求。");
	}

	@Override
	public void send() {
	    System.out.println("具体同事类A发出请求。");
	    /*请中介者转发*/
	    mediator.relay(this); 
	}
}
public class ConcreteColleagueB extends Colleague{

	@Override
	public void receive() {
	    System.out.println("具体同事类B收到请求。");
	}

	@Override
	public void send() {
	    System.out.println("具体同事类B发出请求。");
	    /*请中介者转发*/
	    mediator.relay(this); 
	}
}

       5、测试代码如下:

public class TestMain {

	public static void main(String[] args) {
		Mediator md=new ConcreteMediator();
		Colleague c1=new ConcreteColleagueA();
		Colleague c2=new ConcreteColleagueB();

		md.register(c1);
		md.register(c2);

		c1.send();
		System.out.println("-------------");
		c2.send();
	}
}

       6、输出结果如下:

示例代码实现:

      作为一名标准的90后,现在的聊天工具基本上都是微信,我们通过微信来进行相互沟通,其实也可以看作是中介者模式,微信相当于中介者,我们通过它进行信息的传递,接下来我们使用中介者模式来实现这一个过程。

      1、定义抽象中介者Mediator:

public interface Mediator {

	public void register(User user);
	
	public void relay(User user,String message);
}

      2、定义具体中介者WechatMediator:

public class WechatMediator implements Mediator{

	private List<User> userList = new ArrayList<User>();

	@Override
	public void register(User user) {
		if(!userList.contains(user)){
			userList.add(user);
			user.setMediator(this);
		}
	}
	@Override
	public void relay(User user,String message) {
		for(User u:userList){
			if(!u.equals(user)){
				((User)u).receive(message);
			}   
		}
	}
}

       3、定义抽象用户类User:

public  abstract class User {

	public  Mediator mediator;
	
	public abstract void receive(String message);
	
	public abstract void send(String message);

	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}
}

       4、定义具体用户类ConcreteUserAConcreteUserB:

public class ConcreteUserA extends User{

	@Override
	public void receive(String message) {
		System.out.println("张三收到的消息为:"+message);
	}

	@Override
	public void send(String message) {
		System.out.println("张三发出的消息为:"+message);
		/*请中介者转发*/
		mediator.relay(this,message); 
	}
}
public class ConcreteUserB extends User{

	@Override
	public void receive(String message) {
		System.out.println("李四收到的消息为:"+message);
	}

	@Override
	public void send(String message) {
		System.out.println("李四发出的消息为:"+message);
		/*请中介者转发*/
		mediator.relay(this,message); 
	}
}

       5、测试代码如下:

public class TestMain {

	public static void main(String[] args) {
		Mediator md=new WechatMediator();
		User c1=new ConcreteUserA();
		User c2=new ConcreteUserB();

		md.register(c1);
		md.register(c2);

		c1.send("我喜欢你很久了");
		System.out.println("-------------");
		c2.send("我也是");
	}
}

       6、输出结果如下:

 框架代码实战:

       1、在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐的小三菊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值