博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中介者——对象行为模式
阅读量:2382 次
发布时间:2019-05-10

本文共 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;    }}

两个具体同事类:HouseOwner.java

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); }}

Tenant.java

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); }}

具体中介者对象:中介结构、MediatorStructure.java

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); } }}

客户端:Client.java

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、 就是由于中介者对象需要知道所有的具体同事类,封装具体同事类之间相互关系,导致中介者对象变得非常复杂,系统维护起来较为困难。

你可能感兴趣的文章
使用redis存储全球IP库
查看>>
Snappy Java API简介
查看>>
C/C++中正则表达式库RE2的使用
查看>>
HBase Java API(1.2.X)使用简介
查看>>
Java:实现比较接口时,应该全面的进行各种情况的比较
查看>>
python3.*下用mob_pbxproj自动化修改配置
查看>>
使用fir打包,测试跳转安装的坑
查看>>
版本号大小判断,适用规则(X.X.X.X........)
查看>>
关于Objective-C方法签名规则的说明
查看>>
libxml2.dylb 添加后找不到<libxml/tree.h> 头文件
查看>>
关于 [[self class] alloc]的理解
查看>>
Eclipse导入Web项目后代码不报错但项目报错(左上角有红叉)解决方案
查看>>
List、Set、数据结构、Collections
查看>>
Sudoku Solver
查看>>
Combination Sum
查看>>
First Missing Positive
查看>>
Trapping Rain Water
查看>>
Permutation Sequence
查看>>
Valid Number
查看>>
Text Justification
查看>>