设计模式学习-中介者模式

中介者模式

对于存在着多对多的复杂调用关系的系统,中介者模式提供了一种解决这种复杂关系的处理方案。假设一个系统中有4个对象相互作用,其中一个对象发生了变化,其他3个对象都要执行某个方法:如果每个对象都关联3个对象,那么关联关系将比较复杂,并且难以维护。我们可以设置一个中介者类,关联所有对象,当一个对象发生变化时,由它对其他3个对象进行通知,化繁为简。
在这里插入图片描述
在这里插入图片描述
通过中介者类的中转作用,各个同事对象之间不需要进行显示关联,而是通过中介者类间接作用,实现了解耦,同时也方便对同事对象进行增减。另一方面,中介者和同事对象可以协定并统一调用方法,通过中介者类传递行为,使得同事对象之间的行为解耦。

定义

定义一个对象来封装一系列对象的交互。中介者模式使得各对象之间不需要显示的相互引用,从而使其解耦松散,而且用户可以独特的改变它们之间的交互

结构

  • Mediator抽象中介者
  • ConcreteMediator具体中介者
  • Colleague抽象同事类
  • ConcreteColleague具体同事类
    (https://note.youdao.com/yws/res/3304/DCB41CF3641C45EFB9C1785372E1BFAE)(https://note.youdao.com/yws/res/3304/DCB41CF3641C45EFB9C1785372E1BFAE)]

实例

package mediator;

public abstract class Employee {
	
	String name;

	private Group group;
	
	public Employee(String name) {
		super();
		this.name = name;
	}

	public void waring() {
		System.out.println(this.name + "示警: 老大来了");
		group.warning(this);
	}
	
	public abstract void changeStatus();

	public Group getGroup() {
		return group;
	}

	public void setGroup(Group group) {
		this.group = group;
	}
	
}

package mediator;

public class ConcreteEmployee extends Employee {

	public ConcreteEmployee(String name) {
		super(name);
	}

	@Override
	public void changeStatus() {
		System.out.println(this.name + "收起了手机");
	}
}

package mediator;

public interface Group {

	void add(Employee employee);
	
	void warning(Employee employee);
}

package mediator;

import java.util.ArrayList;
import java.util.List;

public class WXGroup implements Group{
	
	private List<Employee> eList;
	
	public WXGroup() {
		this.eList = new ArrayList<>();
	}

	@Override
	public void add(Employee employee) {
		this.eList.add(employee);
		employee.setGroup(this);
	}

	@Override
	public void warning(Employee employee) {
		for (Employee e : eList) {
			if (employee != e) {
				e.changeStatus();
			}
		}
	}


}

package mediator;

public class Test {

	public static void main(String[] args) {
		Employee e1 = new ConcreteEmployee("张三");
		Employee e2 = new ConcreteEmployee("李四");
		Employee e3 = new ConcreteEmployee("王五");
		Employee e4 = new ConcreteEmployee("赵六");
		
		Group g = new WXGroup();
		g.add(e1);
		g.add(e2);
		g.add(e3);
		g.add(e4);
		
		e1.waring();
	}
}

// 张三示警: 老大来了
// 李四收起了手机
// 王五收起了手机
// 赵六收起了手机

优缺点

  • 结构上进行了解耦,使得多对多的复杂关系得到了简化,通过中介者类的存在使得结构的维护、增减新的同事对象变得更加容易
  • 行为上进行了解耦,当一个对象发生了变化时,不需要显示调用其他所有对象,只要通知中介者,其他对象会得到相应的信息
  • 因为中介者协调同事对象之间的调用关系,随着同事对象的增多和功能的复杂,中介者内部的代码也会变得十分繁琐,维护麻烦

适用场景

  • 系统中对象之间存在着复杂的引用关系
  • 当一个对象状态发生变化时会导致其他对象状态发生相应的改变
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值