行为型模式~中介者模式

本文深入讲解了中介者模式,一种用于降低对象间依赖的设计模式。通过一个婚介所的实例,详细介绍了中介者模式的角色、优缺点及适用场景,帮助读者理解如何在软件设计中应用该模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义:

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

角色:

  1. 抽象中介者:定义出同事对象到中介者对象的统一接口,用于各同事角色对象的通信
  2. 具体中介者:实现抽象中介者,依赖于各个同事角色,通过协调各同事角色实现协作行为
  3. 抽象同事:定义出中介者到同事对象的接口,同事对象只知道中介者而不清楚其余同事对象
  4. 具体同事:实现抽象同事类,每一个具体同事都清除在自己小范围内的行为,而不知道大范围的目的

优点:

  1. 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖,使得对象之间的关系更易维护和理解
  2. 避免同事对象之间过度耦合,同事类只依赖于中介者,使同事类更易被复用,中介类和同事类可以相对独立的演化
  3. 中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理

缺点:

  1. 增加了中介者的复杂性
  2. 协调代码不可以复用

注意:

  1. 不应当在职责划分混乱时使用
  2. 不应当对数据类和方法类使用
  3. 正确理解封装,封装首先是行为,其次是状态,俩者不应该分隔开,
  4. 管理很多对象的相互作用,以便这些对象可以专注于自己的行为

 

实例: 婚介

package 中介者模式;

public interface MarriageAgency {
	public void pair(Person person);
	public void register(Person person);
}
package 中介者模式;

import java.util.ArrayList;

import 中介者模式.Person.Sex;

public class Mapping implements MarriageAgency{

	ArrayList<Man> man = new ArrayList<>();
	ArrayList<Woman> woman = new ArrayList<>();
	
	@Override
	public void pair(Person person) {
		// TODO 自动生成的方法存根
		//System.out.println("开始匹配");
		if(person.sex == Sex.FEMALE){  //女
			for(Man m:man){
				if(m.age == person.requestAge){
					System.out.println(person.name+"匹配成功 与"+m.name);
					return ;
				}
			}
		}else{
			for(Woman m:woman){
				if(m.age == person.requestAge){
					System.out.println(person.name+"匹配成功 与"+m.name);
					return ;
				}
			}
		}
	}

	@Override
	public void register(Person person) {
		// TODO 自动生成的方法存根
		if(person.sex == Sex.FEMALE){  //女
			woman.add((Woman) person);
		}else{
			man.add((Man) person);
		}
	}

}
package 中介者模式;

public abstract class Person {
	public String name;
	public int age;
	public Sex sex;
	public int requestAge;
	MarriageAgency agency;
	public Person(String name,int age,Sex sex,int requestAge,MarriageAgency agency) {
		// TODO 自动生成的构造函数存根
		this.name = name;
		this.age =age;
		this.sex = sex;
		this.requestAge = requestAge;
		this.agency = agency;
		this.agency.register(this);
		
	}
	public void find() {
		this.agency.pair(this);
	}
	enum Sex{
		MALE,FEMALE;
	}
}
package 中介者模式;

public class Man extends Person{

	public Man(String name, int age,  int requestAge,
			MarriageAgency agency) {
		super(name, age,Sex.MALE, requestAge, agency);
		// TODO 自动生成的构造函数存根
	}
	

}
package 中介者模式;

public class Woman extends Person{

	public Woman(String name, int age, int requestAge,
			MarriageAgency agency) {
		super(name, age,Sex.FEMALE, requestAge, agency);
		// TODO 自动生成的构造函数存根
	}

}
package 中介者模式;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		MarriageAgency marriageAgency  = new Mapping();
		Person p1 = new Man("小明", 18, 18, marriageAgency);
		Person p2 = new Man("小强", 19, 20, marriageAgency);
		Person p3 = new Man("小胖", 20, 19, marriageAgency);
		
		Person b1 = new Woman("小兰", 18, 18, marriageAgency);
		Person b2 = new Woman("小花", 19, 20, marriageAgency);
		Person b3 = new Woman("小琴", 20, 19, marriageAgency);
		
		p1.find();
		p2.find();
		p3.find();
		System.out.println();
		b1.find();
		b2.find();
		b3.find();
	}

}

小明匹配成功 与小兰
小强匹配成功 与小琴
小胖匹配成功 与小花

小兰匹配成功 与小明
小花匹配成功 与小胖
小琴匹配成功 与小强

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值