行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化;
行为型模式共有11种:
■ 模板方法模式
■ 命令模式
■ 责任链模式
■ 策略模式
■ 迭代器模式
■ 中介者模式
■ 观察者模式
■ 备忘录模式
■ 访问者模式
■ 状态模式
■ 解释器模式
一、中介者模式的简介
■ 用一个中介对象封装一系列对象(同事)的交互,中介者使各对象不需要显式地相互作用;
■ 行为与状态是不应该分割开的;
■ 中介者模式的用途是管理很多的对象的相互作用;

image.png
中介者模式4个角色:
■ 抽象中介者(Mediator)角色:
该角色定义出同事对象到中介者对象的统一接口,用于各同事角色之间的通信;
■ 具体中介者(Concrete Mediator)角色:
该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为;
■ 抽象同事(Colleague)角色:
该角色定义出中介者到同事对象的接口,同事对象只知道中介者而不知道其余的同事对象;
■ 具体同事(Concrete Colleague)角色:
该角色实现抽象同事类,每一个具体同事类都清楚自己在小范围内的行为,而不知道大范围内的目的;
/**
* 抽象中介者
*/
public abstract class Mediator {
/**
* 中介者模式的业务逻辑方法
* @param c
*/
public abstract void colleagueChanged(Colleague c);
}
/**
* 具体中介者
*/
public class ConcreteMediator extends Mediator{
private ConcreteMediator1 c1;
private ConcreteMediator2 c2;
/**
* 中介者模式的业务逻辑方法
* @param c
*/
@Override
public void colleagueChanged(Colleague c) {
c.action();
}
public void createConcreteMediator(){
c1 = new ConcreteMediator1(this);
c2 = new ConcreteMediator2(this);
}
public ConcreteMediator1 getC1() {
return c1;
}
public ConcreteMediator2 getC2() {
return c2;
}
}
/**
* 抽象同事
*/
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator m){
this.mediator = m ;
}
public Mediator getMediator() {
return mediator;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
/**
* 抽象行动方法,由子类实现
*/
public abstract void action();
/**
* 业务方法,调用此方法改变对象的内部状态
*/
public void change(){
this.mediator.colleagueChanged(this);
}
}
/**
* 具体同事1
*/
public class ConcreteMediator1 extends Colleague{
public ConcreteMediator1(Mediator m){
super(m);
}
@Override
public void action(){
System.out.println("具体同事1的行动方法");
}
}
/**
* 具体同事2
*/
public class ConcreteMediator2 extends Colleague{
public ConcreteMediator2(Mediator m){
super(m);
}
@Override
public void action(){
System.out.println("具体同事2的行动方法");
}
}
/**
* 应用代码
*/
public class ClientDemo {
public static void main(String[] args){
ConcreteMediator cm = new ConcreteMediator();
cm.createConcreteMediator();
ConcreteMediator1 c1 = cm.getC1();
ConcreteMediator2 c2 = cm.getC2();
c1.change();
c2.change();
}
}
# 控制台输出:
具体同事1的行动方法
具体同事2的行动方法
二、中介者模式的优缺点
中介者模式的优点:
■ 减少类间的依赖,将原有的一对多的依赖变成一对一的依赖;
■ 避免同事对象之间过度耦合;
■ 中介者模式将对象的行为和协作抽象化;
中介者模式的缺点:
■ 增加了中介者类的复杂性;
■ 中介者类经常充满了各个具体同事类的关系协调代码,这种代码是不能复用的;
下列几种情况下,不适合使用中介者模式:
■ 不应当在责任划分混乱时使用;
■ 不应当对数据类和方法类使用;
三、中介者模式的实例
# 使用中介者模式模拟婚姻中介所的工作过程;

image.png
/**
* 婚姻中介所接口
*/
public interface MarriageAgency {
/**
* 为person配对
* @param person
*/
void pair(Person person);
/**
* 注册会员
* @param person
*/
void register(Person person);
}
/**
* 婚姻中介所实现类
*/
public class MarriageAgencyImpl implements MarriageAgency{
List<Man> men = new ArrayList<>();
List<Woman> women = new ArrayList<>();
@Override
public void pair(Person person) {
if(person.sex.equals(Sex.MALE)){
for(Woman w : women){
if(w.age == person.requestAge){
System.out.println(person.name + " " + w.name + " 匹配成功!");
return;
}
}
}else if(person.sex.equals(Sex.FEMALE)){
for(Man m : men){
if(m.age == person.requestAge){
System.out.println(person.name + " " + m.name + " 匹配成功!");
return;
}
}
}
System.out.println("没有合适的对象");
}
@Override
public void register(Person person) {
if(person.sex.equals(Sex.MALE)){
men.add((Man) person);
}else if(person.sex.equals(Sex.FEMALE)){
women.add((Woman) person);
}
}
}
/**
* 人的抽象类
*/
public abstract class Person {
/**
* 姓名
*/
String name;
/**
* 年龄
*/
int age;
/**
* 性别
*/
Sex sex;
/**
* 期望配偶年龄
*/
int requestAge;
/**
* 婚介
*/
MarriageAgency marriageAgency;
public Person(String name, int age, Sex sex, int requestAge, MarriageAgency marriageAgency) {
this.name = name;
this.age = age;
this.sex = sex;
this.requestAge = requestAge;
this.marriageAgency = marriageAgency;
/**
* 注册会员
*/
marriageAgency.register(this);
}
/**
* 寻找对象
*/
public void findPartner(){
marriageAgency.pair(this);
}
}
enum Sex{
MALE , FEMALE
}
/**
* 男人类
*/
public class Man extends Person{
public Man(String name, int age, Sex sex, int requestAge, MarriageAgency marriageAgency) {
super(name, age, sex, requestAge, marriageAgency);
}
}
/**
* 女人类
*/
public class Woman extends Person{
public Woman(String name, int age, Sex sex, int requestAge, MarriageAgency marriageAgency) {
super(name, age, sex, requestAge, marriageAgency);
}
}
/**
* 应用代码
*/
public class ClientDemo {
public static void main(String[] args){
MarriageAgency marriageAgency = new MarriageAgencyImpl();
Person p1 = new Man("张三",23,Sex.MALE,18,marriageAgency);
Person p2 = new Man("李四",27,Sex.MALE,25,marriageAgency);
Person p3 = new Woman("王五",25,Sex.FEMALE,27,marriageAgency);
Person p4 = new Woman("赵四",20,Sex.FEMALE,22,marriageAgency);
p1.findPartner();
p2.findPartner();
}
}
# 控制台输出:
没有合适的对象
李四 王五 匹配成功!
参考:
摘录 《设计模式(Java版)》韩敬海主编;(微信读书APP中有资源,可以直接阅读)
网友评论