写在后面
- 记录学习设计模式的笔记
- 进步对设计模式的灵活运用
学习地址
https://www.bilibili.com/vide…
https://www.bilibili.com/vide…
参考文章
http://c.biancheng.net/view/1…
我的项目源码
https://gitee.com/zhuang-kang/DesignPattern
22,中介者模式
一般来说,共事类之间的关系是比较复杂的,多个共事类之间相互关联时,他们之间的关系会出现为简单的网状结构,这是一种适度耦合的架构,即不利于类的复用,也不稳固。例如在下左图中,有六个共事类对象,如果对象 1 发生变化,那么将会有 4 个对象受到影响。如果对象 2 发生变化,那么将会有 5 个对象受到影响。也就是说,共事类之间间接关联的设计是不好的。
如果引入中介者模式,那么共事类之间的关系将变为星型构造,从下右图中能够看到,任何一个类的变动,只会影响的类自身,以及中介者,这样就减小了零碎的耦合。一个好的设计,必然不会把所有的对象关系解决逻辑封装在本类中,而是应用一个专门的类来治理那些不属于本人的行为。
22.1 中介者模式的定义和特点
中介者(Mediator)模式的定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合涣散,且能够独立地扭转它们之间的交互。中介者模式又叫调解模式,它是迪米特法令的典型利用。
中介者模式是一种对象行为型模式,其次要长处如下。
- 类之间各司其职,合乎迪米特法令。
- 升高了对象之间的耦合性,使得对象易于独立地被复用。
- 将对象间的一对多关联转变为一对一的关联,进步零碎的灵活性,使得零碎易于保护和扩大。
其次要毛病是:中介者模式将本来多个对象间接的相互依赖变成了中介者和多个共事类的依赖关系。当共事类越多时,中介者就会越臃肿,变得复杂且难以保护。
22.2 中介者模式的构造与实现
22.2.1 中介者模式的构造
- 形象中介者(Mediator)角色:它是中介者的接口,提供了共事对象注册与转发共事对象信息的形象办法。
- 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来治理共事对象,协调各个共事角色之间的交互关系,因而它依赖于共事角色。
- 形象共事类(Colleague)角色:定义共事类的接口,保留中介者对象,提供共事对象交互的形象办法,实现所有相互影响的共事类的公共性能。
- 具体共事类(Concrete Colleague)角色:是形象共事类的实现者,当须要与其余共事对象交互时,由中介者对象负责后续的交互。
22.2.2 代码实现
当初租房根本都是通过房屋中介,房主将屋宇托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与屋宇所有者之间的中介者
关系类图
Mediator
package com.zhuang.mediator;
/**
* @Classname Mediator
* @Description 形象中介者
* @Date 2021/3/28 20:45
* @Created by dell
*/
public abstract class Mediator {
// 申明一个联系办法
public abstract void constact(String message, Person person);
}
Person
package com.zhuang.mediator;
/**
* @Classname Person
* @Description 形象共事类
* @Date 2021/3/28 20:45
* @Created by dell
*/
public abstract class Person {
protected String name;
protected Mediator mediator;
public Person(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
HouseOwner
package com.zhuang.mediator;
/**
* @Classname HouseOwner
* @Description 具体共事类 屋宇拥有者
* @Date 2021/3/28 20:45
* @Created by dell
*/
public class HouseOwner extends Person{public HouseOwner(String name, Mediator mediator) {super(name, mediator);
}
// 与中介者分割
public void constact(String message){mediator.constact(message,this);
}
// 获取信息
public void getMessage(String message){System.out.println("房主"+name+"获取的信息:"+message);
}
}
Tenant
package com.zhuang.mediator;
/**
* @Classname Tenant
* @Description 具体共事类 承租人
* @Date 2021/3/28 20:46
* @Created by dell
*/
public class Tenant extends Person{public Tenant(String name, Mediator mediator) {super(name, mediator);
}
// 与中介者分割
public void constact(String message){mediator.constact(message,this);
}
// 获取信息
// 获取信息
public void getMessage(String message){System.out.println("租房者"+name+"获取的信息:"+message);
}
}
MediatorStructure
package com.zhuang.mediator;
/**
* @Classname MediatorStructure
* @Description 中介机构
* @Date 2021/3/28 20:46
* @Created by dell
*/
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;}
@Override
public void constact(String message, Person person) {if (person == houseOwner) {
// 如果是房主,则租房者取得信息
tenant.getMessage(message);
} else {
// 反之是房主取得信息
houseOwner.getMessage(message);
}
}
}
Client
package com.zhuang.mediator;
/**
* @Classname Client
* @Description 中介者模式 测试类
* @Date 2021/3/28 20:47
* @Created by dell
*/
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("我有一间房子,你要租吗???");
}
}
22.3 中介者模式利用场景
- 当对象之间存在简单的网状结构关系而导致依赖关系凌乱且难以复用时。
- 当想创立一个运行于多个类之间的对象,又不想生成新的子类时。
22.4 中介者模式的注意事项和细节
- 多个类互相耦合,会造成网状结构,应用中介者模式将网状结构拆散为星型构造,进行解耦
- 缩小类间依赖,升高了耦合,合乎迪米特法令
- 中介者承当较多责任,出问题,零碎会受到影响
- 设计不当,理论应用,特地留神
写在最初
- 如果我的文章对你有用,请给我点个👍,感激你😊!
- 有问题,欢送在评论区指出!💪