您的位置:首页 > 其它

Mediator Pattern-中介者模式

2017-10-08 22:39 483 查看
中介者模式(行为型模式): 用一个中介者对象封装一系列的对象交互, 中介者使个对象不需要显示进行相互作用, 从而降低各类之间的耦合,可以独立的改变他们的交互



中介者模式的组成

抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。

中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。

同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。

Demo演示

下面以主板为例子,演示中介者模式的使用,使用主板协调音频和屏幕信息,比如实现一个这样的功能,在播放视频的时候打开音频,在播放音乐的时候打开视频

UML图



抽象同事类

// 同事类角色
abstract class Colleague {
BoardMediator mediator;
boolean isPlaying;

Colleague(BoardMediator mediator) {
this.mediator = mediator;
}

public boolean isPlaying() {
return isPlaying;
}
}


同事类角色(音视频管理类)

// 音频模块
class AudioManager extends Colleague {

public AudioManager(BoardMediator mediator) {
super(mediator);
}

// 播放音乐
public void playSound() {
System.out.println("AudioManager: 开始播放音乐");
isPlaying = true;
mediator.change(this);
}

}


// 图像模块
class WindowManager extends Colleague {

public WindowManager(BoardMediator mediator) {
super(mediator);
}

public void playVideo() {
System.out.println("windowManager: 开始播放视频");
isPlaying = true;
mediator.change(this);
}
}


中介者模块: 主板

// 中介者角色
// 主板协调者,用于协调电脑各组件
class BoardMediator {

private AudioManager audio;
private WindowManager widow;

public void setAudio(AudioManager audio) {
this.audio = audio;
}

public void setWidow(WindowManager widow) {
this.widow = widow;
}

// 中介者进行协调工作
public void change(Colleague colleague) {
if (colleague instanceof WindowManager) {
// 播放视频时,打开音乐播放器
if (!audio.isPlaying()) {
audio.playSound();
}
}

if (colleague instanceof AudioManager) {
// 播放音乐时,打开屏幕
if (!widow.isPlaying()) {
widow.playVideo();
}
}
}
}


调用示例

public class Main {

public static void main(String[] args) {
// 创建中介者
BoardMediator mediator = new BoardMediator();
// 创建同事类
AudioManager audio = new AudioManager(mediator);
WindowManager window = new WindowManager(mediator);
// 注册同事对象
mediator.setAudio(audio);
mediator.setWidow(window);

// window开始播放视频
window.playVideo();

// 结果
/*windowManager: 开始播放视频
AudioManager: 开始播放音乐*/
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: