行为模式-中介者模式

行为型模式一共有11种:

  • 模板方法模式(Template Method)
  • 策略模式(Strategy)
  • 命令模式(Command)
  • 中介者模式(Mediator)
  • 观察者模式(Observer)
  • 迭代器模式(Iteratior)
  • 访问者模式(Visiter)
  • 责任链模式(Chain of Responsibility)
  • 备忘录模式(Memento)
  • 状态模式(State)
  • 解释器模式(Interpreter)

  其中有分为:

  算法封装:模板方法、策略、命令模式

  对象去耦:中介、观察者模式

  抽象集合:迭代器模式

  行为扩展:访问者、责任链模式

  对象状态:状态模式

  解释器模式

这次主要讲解中介者模式

一、 定义

定义一个中介者对象, 封装一系列对象的交互关系, 使得各对象不必显示的相互引用, 从而使其耦合松散, 而且可以独立的改变它们的交互。

二、 理解

各对象显式地持有对方引用, 用于对象之间的交互, 交互关系形成网状结构, 不利于系统维护以及开发人员的理解. 这时可以定义一个中介者对象, 封装注册各对象的引用, 以及完成对象之间的交互操作. 同事对象之间不能直接交互, 它们之间的交互, 需要委托给中介者对象完成, 即 同事对象除了完成自己本身的操作之外, 只和中介者打交道(符合最少知识原则), 如此一来, 交互关系将由复杂的网状结构变成星型结构.  方便系统维护以及开发人员的理解. 

  关键点在于同事对象之间不能直接交互, 交互依赖于中介者完成, 中介者注册管理各同事对象的引用, 以及负责转发消息, 实现他们之间的交互。

1) Mediator 抽象中介者

    用于定义统一的接口, 用于各同事对象之间的交互

  2) Concrete Mediator 具体中介者

    具体中介者持有各同事对象的引用, 负责协调各同事对象的行为以完成协作, 因此具体中介者必须依赖具体同事对象(不符合依赖倒置原则)

  3) Colleague 同事角色

    每个同事角色都知道中介者对象, 而且与其他同事角色通信的时候,都通过中介者协作完成

  每个同事角色都有两种行为:

    a. 自发行为: 同事本身的行为, 如修改自身的状态, 与其他同事或者中介者没有任何的依赖.

    b. 依赖方法: 必须依赖中介者才能完成的行为.

三、优缺点

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。Mediator的出现减少了各个Member的耦合,使得可以独立地改变和服用各个Mediator和Member。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。由于Mediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个Member都复杂。

四、使用场景

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。

五、实例

public abstract class Member {
protected Mediator mediator;
public Mediator getMediator() {
return mediator;
}

public void setMediator(Mediator mediator) {
this.mediator = mediator;
}

public abstract void notifyOthers(String info);
public void getInfo(String fromWho, String info){
System.out.println(this.getClass().getName() + " 收到来自 " + fromWho + " 的消息: " + info);
}
}
public class Member01 extends Member{ public void notifyOthers(String info)

{

super.mediator.notifyOthers(info,this);

}

}

public class Member02 extends Member{

public void notifyOthers(String info){

super.mediator.notifyOthers(info,this);

}

}

public class Member03 extends Member{

public void notifyOthers(String info){

super.mediator.notifyOthers(info,this);

}

}

public class Mediator {
private Member member01;
private Member member02;
private Member member03;

public Mediator(Member member01, Member member02, Member member03) {
this.member01 = member01;
this.member02 = member02;
this.member03 = member03;
}

public void notifyOthers(String info, Member member){
String name = member.getClass().getName();
name = name.substring(name.lastIndexOf(".")+1);
switch (name){
case "Member01": {
member02.getInfo(name,info);
member03.getInfo(name,info);
break;
}
case "Member02": {
member01.getInfo(name,info);
member03.getInfo(name,info);
break;
}
case "Member03": {
member01.getInfo(name,info);
member02.getInfo(name,info);
break;
}
}
}
}

public class Client {
public static void main(String[] args) {

Member member01 = new Member01();
Member member02 = new Member02();
Member member03 = new Member03();
Mediator mediator = new Mediator(member01, member02, member03);
member01.setMediator(mediator);
member02.setMediator(mediator);
member03.setMediator(mediator);

member01.notifyOthers("消息1");
member02.notifyOthers("消息2");
member03.notifyOthers("消息3");
}
}
结果输出

designPatterns.behaviorTypePatterns.mediatorPattern.member.Member02 收到来自 Member01 的消息: 消息1
designPatterns.behaviorTypePatterns.mediatorPattern.member.Member03 收到来自 Member01 的消息: 消息1
designPatterns.behaviorTypePatterns.mediatorPattern.member.Member01 收到来自 Member02 的消息: 消息2
designPatterns.behaviorTypePatterns.mediatorPattern.member.Member03 收到来自 Member02 的消息: 消息2
designPatterns.behaviorTypePatterns.mediatorPattern.member.Member01 收到来自 Member03 的消息: 消息3
designPatterns.behaviorTypePatterns.mediatorPattern.member.Member02 收到来自 Member03 的消息: 消息3

参考文献:https://blog.csdn.net/weixin_42746530/article/details/91041666

https://www.cnblogs.com/timfruit/p/10990506.html

https://www.cnblogs.com/shuigu/p/6911827.html

视频地址:https://www.bilibili.com/video/BV1d5411t7ad/

猜你喜欢

转载自www.cnblogs.com/lyt96/p/12727030.html