中介者模式
用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显示地相互作用,从而使其耦合度松散,而且可以独立地改变他们之间的交互。
中介模式角色
抽象中介(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();
}
}