本文共 3457 字,大约阅读时间需要 11 分钟。
定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。
1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2、一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
Mediator:中介者接口。在里面定义了各个同事之间相互交互所需要的方法,可以是公共的方法,如Change方法,也可以是小范围的交互方法。
ConcreteMediator:具体的中介者实现对象。它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系。
Colleague:同事类的定义,通常实现成为抽象类,主要负责约束同事对象的类型,并实现一些具体同事类之间的公共功能,比如,每个具体同事类都应该知道中介者对象,也就是每个同事对象都会持有中介者对象的引用,这个功能可定义在这个类中。
ConcreteColleague:具体的同事类,实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。
public abstract class Mediator { //申明一个联络方法 public abstract void constact(String message,Person person);} 然后是抽象同事对象:Person.javapublic abstract class Person { protected String name; protected Mediator mediator; Person(String name,Mediator mediator){ this.name = name; this.mediator = mediator; }}
public class HouseOwner extends Person{ HouseOwner(String name, Mediator mediator) { super(name, mediator); } /** * @desc 与中介者联系 * @param message * @return void */ public void constact(String message){ mediator.constact(message, this); } /** * @desc 获取信息 * @param message * @return void */ public void getMessage(String message){ System.out.println("房主:" + name +",获得信息:" + message); }}
public class Tenant extends Person{ Tenant(String name, Mediator mediator) { super(name, mediator); } /** * @desc 与中介者联系 * @param message * @return void */ public void constact(String message){ mediator.constact(message, this); } /** * @desc 获取信息 * @param message * @return void */ public void getMessage(String message){ System.out.println("租房者:" + name +",获得信息:" + message); }}
public class MediatorStructure extends Mediator{ //首先中介结构必须知道所有房主和租房者的信息 private HouseOwner houseOwner; private Tenant tenant; public HouseOwner getHouseOwner() { return houseOwner; } public void setHouseOwner(HouseOwner houseOwner) { this.houseOwner = houseOwner; } public Tenant getTenant() { return tenant; } public void setTenant(Tenant tenant) { this.tenant = tenant; } public void constact(String message, Person person) { if(person == houseOwner){ //如果是房主,则租房者获得信息 tenant.getMessage(message); } else{ //反正则是房主获得信息 houseOwner.getMessage(message); } }}
public class Client { public static void main(String[] args) { //一个房主、一个租房者、一个中介机构 MediatorStructure mediator = new MediatorStructure(); //房主和租房者只需要知道中介机构即可 HouseOwner houseOwner = new HouseOwner("张三", mediator); Tenant tenant = new Tenant("李四", mediator); //中介结构要知道房主和租房者 mediator.setHouseOwner(houseOwner); mediator.setTenant(tenant); tenant.constact("听说你那里有三室的房主出租....."); houseOwner.constact("是的!请问你需要租吗?"); }}
1.降低了系统对象之间的耦合性,使得对象易于独立的被复用。
2.提高系统的灵活性,使得系统易于扩展和维护。
中介者模式的缺点是显而易见的,因为这个“中介“承担了较多的责任,所以一旦这个中介对象出现了问题,那么整个系统就会受到重大的影响。
1、 在中介者模式中通过引用中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少。它简化了系统的结构,将系统由负责的网状结构转变成简单的星形结构,中介者对象在这里起到中转和协调作用。
2、 中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象间的交互进行进一步的控制。
3、 通过使用中介者模式,具体的同事类可以独立变化,通过引用中介者可以简化同事类的设计和实现。
4、 就是由于中介者对象需要知道所有的具体同事类,封装具体同事类之间相互关系,导致中介者对象变得非常复杂,系统维护起来较为困难。