行为型模式-中介者模式

来源:互联网 发布:微信小动画制作软件 编辑:程序博客网 时间:2024/05/21 22:37

中介者模式

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

 

中介模式角色

抽象中介(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}@Overridepublic void action() {System.out.println("这是同事A执行的方法");}}

package mediator;//具体同事类public class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator m) {super(m);// TODO Auto-generated constructor stub}@Overridepublic 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);}//获取同事对象Apublic ConcreteColleagueA getA() {return a;}//获取同事对象Bpublic 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);}}@Overridepublic 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();}}



0 0