行为型模式-中介者模式

中介者模式

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

 

中介模式角色

抽象中介(Mediator)角色:该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信;

具体中介(Concrete Mediator)角色:该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为;

抽象同事(Colleague)角色:该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象;

具体同事(Concrete Colleague)角色:该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围的目的。

 

中介者模式优点

减少类间的依赖,将原有一对多的依赖关系变成一对一的依赖,使得对象之间的关系更容易维护和理解;

避免同事对象之间的过度耦合,同事类只依赖于中介者,使同事类更容易被复用,中介类和同事类可以相对独立地演化;

中介者模式将对象的行为和协作抽象化,将对象在小尺度的行为上与其他对象的相互作用分开处理。

 

中介者模式缺点

中介者模式降低了同事对象的复杂度,但增加了中介者类的复杂性;

中介者类经常充满了各个具体同事类的关系协调代码,这种代码不能复用的。

 

 例1:

package mediator;

public abstract class Colleague {
	
	private Mediator mediator;
	//构造函数
	public Colleague(Mediator m){
		this.mediator = m;
	}
	
	//抽象活动方法,由子类实现
	public abstract void action();
	
	//业务方法,调用此方法改变对象的内部状态
	public void change(){
		this.mediator.colleagueChanged(this);
	}
	
	public Mediator getMediator() {
		return mediator;
	}
	public void setMediator(Mediator mediator) {
		this.mediator = mediator;
	}
	
}

package mediator;

//具体同事类
public class ConcreteColleagueA extends Colleague {

	public ConcreteColleagueA(Mediator m) {
		super(m);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void action() {
		System.out.println("这是同事A执行的方法");

	}

}

package mediator;

//具体同事类
public class ConcreteColleagueB extends Colleague {

	public ConcreteColleagueB(Mediator m) {
		super(m);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void action() {
		System.out.println("这是同事B执行的方法");

	}

}

package mediator;

//抽象中介者
public interface Mediator {

	//中介模式的逻辑方法
	public abstract void colleagueChanged(Colleague c);
}

package mediator;

public class ConcreteMediator implements Mediator {

	private ConcreteColleagueA a;
	
	private ConcreteColleagueB b;
	
	//中介者模式的业务逻辑方法
	public void colleagueChanged(Colleague c) {
		c.action();
	}

	//工厂方法,创建同事对象
	public void createConcreteMediator(){
		a = new ConcreteColleagueA(this);
		b = new ConcreteColleagueB(this);
	}

	//获取同事对象A
	public ConcreteColleagueA getA() {
		return a;
	}

	//获取同事对象B
	public ConcreteColleagueB getB() {
		return b;
	}
		
}

package mediator;

import mediator.Person.Sex;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建中介对象
		Mediator mediator = new ConcreteMediator();
		Colleague c = new ConcreteColleagueA(mediator);
		c.change();
		
		c = new ConcreteColleagueB(mediator);
		c.change();
		
		
		
	}

}

例2:

package mediator;

public abstract class Person {

	private String name;
	private int age;
	private Sex sex;
	private int requestAge;//要求的对象年龄,假设只有一个要求
	//持有个婚姻中介
	private MerriageAgency agency;
	
	public Person(String name,int age,Sex sex,int requestAge,MerriageAgency agency){
		this.name = name;
		this.age = age;
		this.sex = sex;
		this.requestAge = requestAge;
		this.agency = agency;
		//通过中介,注册会员
		this.agency.register(this);
	}
	enum Sex{
		MALE,FEMALE;
	}
	
	//寻找对象
	public void findPartner(){
		this.agency.pair(this);
	}

	public String getName() {
		return name;
	}

	public int getAge() {
		return age;
	}

	public Sex getSex() {
		return sex;
	}

	public int getRequestAge() {
		return requestAge;
	}

	public MerriageAgency getAgency() {
		return agency;
	}
	
	
}
package mediator;

public class Main extends Person {

	public Main(String name, int age, Sex sex, int requestAge,
			MerriageAgency agency) {
		super(name, age, sex, requestAge, agency);
		// TODO Auto-generated constructor stub
	}

}

package mediator;

public class Woman extends Person {

	public Woman(String name, int age, Sex sex, int requestAge,
			MerriageAgency agency) {
		super(name, age, sex, requestAge, agency);
		// TODO Auto-generated constructor stub
	}

}

package mediator;
//抽象中介婚姻介绍单位
public interface MerriageAgency {

	//注册会员
	public void register(Person person);
	
	//配对
	public void pair(Person person);
}

package mediator;

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

import mediator.Person.Sex;

public class ConcreteMerriageAgency implements MerriageAgency {

	//婚姻介绍所拥有的男会员
	private List<Main> men = new ArrayList<Main>();
	//女会员
	private List<Woman> women = new ArrayList<Woman>();
	
	public void register(Person person) {
		if(person.getSex() == Sex.MALE){
			men.add((Main) person);
		}else if(person.getSex() == Sex.FEMALE){
			women.add((Woman) person);
		}
		
	}

	@Override
	public void pair(Person person) {
		if(person.getSex() == Sex.MALE){
			for(Woman woman : women){
				if(person.getRequestAge() == woman.getRequestAge()){
					System.out.println(person.getName() + "和"+woman.getName()+"配对成功");
					return;
				}
			}
		}else if(person.getSex() == Sex.FEMALE){
			for(Main main : men){
				if(person.getRequestAge() == main.getRequestAge()){
					System.out.println(person.getName() + "和"+main.getName()+"配对成功");
					return;
				}
			}
		}
		System.out.println(person.getName()+"配对失败");
		
		
	}

	
}

package mediator;

import mediator.Person.Sex;

public class Client {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建中介对象
	
		
		MerriageAgency agency = new ConcreteMerriageAgency();
		
		Person m1 = new Main("John",20,Sex.MALE,20, agency);
		Person m2 = new Main("Jak",22,Sex.MALE,22, agency);
		Person w1 = new Woman("Lily",0, Sex.FEMALE,22,agency);
		Person w2 = new Woman("Mary",20,Sex.FEMALE,21, agency);
		
		m1.findPartner();
		m2.findPartner();
		w1.findPartner();
		w2.findPartner();
		
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值