Skip to content

Commit a50bcd4

Browse files
committed
增加了以播放视频为例子的中介者模式的讲解
1 parent 19a1f01 commit a50bcd4

File tree

13 files changed

+326
-0
lines changed

13 files changed

+326
-0
lines changed
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.company.mediator.computer;
2+
3+
4+
/**
5+
* 光驱同事
6+
* CD设备负责读取光盘的数据并将数据提供给主板
7+
*/
8+
public class CDDevice extends Colleague {
9+
10+
private String data;//视频数据
11+
12+
public CDDevice(Mediator mediator) {
13+
super(mediator);
14+
}
15+
16+
/**
17+
* 读取视频数据
18+
*
19+
* @return 视频数据
20+
*/
21+
public String read() {
22+
return data;
23+
}
24+
25+
/**
26+
* 加载视频数据
27+
*/
28+
public void load() {
29+
// 实际情况中视频数据与音频诗句都在一个数据流中
30+
data = "视频数据,音频数据";
31+
mediator.changed(this);
32+
}
33+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.company.mediator.computer;
2+
3+
/**
4+
* CPU同事,负责从主板传递来的音、视频数据的解码
5+
*/
6+
public class CPU extends Colleague {
7+
8+
private String dataVideo, dataSound;//视频和音频数据
9+
10+
public CPU(Mediator mediator) {
11+
super(mediator);
12+
}
13+
14+
/**
15+
* 获取视频数据
16+
*
17+
* @return 视频数据
18+
*/
19+
public String getDataVideo() {
20+
return dataVideo;
21+
}
22+
23+
/**
24+
* 获取音频数据
25+
*
26+
* @return 音频数据
27+
*/
28+
public String getDataSound() {
29+
return dataSound;
30+
}
31+
32+
33+
/**
34+
* 解码数据
35+
*
36+
* @param data 音、视频数据
37+
*/
38+
public void decodeData(String data) {
39+
40+
//分隔 音、视频数据
41+
String[] temp = data.split(",");
42+
43+
//解析音、视频数据
44+
dataVideo = temp[0];
45+
dataSound = temp[1];
46+
47+
mediator.changed(this);
48+
49+
}
50+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.company.mediator.computer;
2+
3+
4+
/**
5+
* 通过客户端来模式电脑播放电影的效果
6+
*/
7+
public class Client {
8+
9+
public static void main(String[] args) {
10+
11+
//构造主板对象
12+
MainBoard mediator = new MainBoard();
13+
14+
//分别构造各个零部件
15+
CDDevice cdDevice = new CDDevice(mediator);
16+
CPU cpu = new CPU(mediator);
17+
GraphicsCard gc = new GraphicsCard(mediator);
18+
SoundCard soundCard = new SoundCard(mediator);
19+
20+
//将各个零部件安装到主板
21+
mediator.setCdDevice(cdDevice);
22+
mediator.setCpu(cpu);
23+
mediator.setSoundCard(soundCard);
24+
mediator.setGraphicsCard(gc);
25+
26+
//完成后就可以开始放片了
27+
cdDevice.load();
28+
}
29+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.company.mediator.computer;
2+
3+
4+
//抽象同事
5+
public abstract class Colleague {
6+
protected Mediator mediator;//每一个同事都应该知道它的中介者
7+
8+
public Colleague(Mediator mediator) {
9+
this.mediator = mediator;
10+
}
11+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.company.mediator.computer;
2+
3+
4+
/**
5+
* 显卡同事 :播放视频
6+
*/
7+
public class GraphicsCard extends Colleague {
8+
public GraphicsCard(Mediator mediator) {
9+
super(mediator);
10+
}
11+
12+
/**
13+
* 播放视频
14+
*
15+
* @param data 视频数据
16+
*/
17+
public void videoPlay(String data) {
18+
System.out.println("视频:" + data);
19+
}
20+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.company.mediator.computer;
2+
3+
4+
/**
5+
* 主板中介者
6+
*/
7+
public class MainBoard extends Mediator {
8+
9+
private CDDevice cdDevice;//光驱设备
10+
private CPU cpu;// CPU
11+
private SoundCard soundCard;//声卡设备
12+
private GraphicsCard graphicsCard;//显卡设备
13+
14+
15+
@Override
16+
public void changed(Colleague c) {
17+
// 如果光驱读取了数据
18+
if (c == cdDevice) { //关于此处为什么用 == 而不是instanceOf 是因为在客户端最终调用之前给中介者
19+
// 设置了同一个光驱 和 cpu,所以比较的内存地址
20+
handleCD((CDDevice) c);
21+
} else if (c == cpu) {//如果CPU处理完数据
22+
handleCPU((CPU) c);
23+
}
24+
}
25+
26+
/**
27+
* 处理光驱读取数据后与其他设备的交互
28+
*
29+
* @param cdDevice
30+
*/
31+
private void handleCD(CDDevice cdDevice) {
32+
cpu.decodeData(cdDevice.read());
33+
}
34+
35+
/**
36+
* 处理cpu读取数据后与其他设备的交互
37+
*
38+
* @param cpu
39+
*/
40+
private void handleCPU(CPU cpu) {
41+
soundCard.soundPlay(cpu.getDataSound());
42+
graphicsCard.videoPlay(cpu.getDataVideo());
43+
}
44+
45+
46+
/**
47+
* 设置CD设备
48+
*
49+
* @param cdDevice cd设备
50+
*/
51+
public void setCdDevice(CDDevice cdDevice) {
52+
this.cdDevice = cdDevice;
53+
}
54+
55+
56+
/**
57+
* 设置cpu
58+
*
59+
* @param cpu
60+
*/
61+
public void setCpu(CPU cpu) {
62+
this.cpu = cpu;
63+
}
64+
65+
66+
/**
67+
* 设置声卡
68+
*
69+
* @param soundCard 声卡设备
70+
*/
71+
public void setSoundCard(SoundCard soundCard) {
72+
this.soundCard = soundCard;
73+
}
74+
75+
/**
76+
* 设置显卡
77+
*
78+
* @param graphicsCard 显卡设备
79+
*/
80+
public void setGraphicsCard(GraphicsCard graphicsCard) {
81+
this.graphicsCard = graphicsCard;
82+
}
83+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.company.mediator.computer;
2+
3+
//抽象中介者
4+
public abstract class Mediator {
5+
6+
/**
7+
* 同事对象改变时通知中介者的方法
8+
* 在同事对象改变时由中介者去通知其他的同事对象
9+
*
10+
* @param c 同事对象
11+
*/
12+
public abstract void changed(Colleague c);
13+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.company.mediator.computer;
2+
3+
/**
4+
* 声卡同事
5+
*/
6+
public class SoundCard extends Colleague {
7+
public SoundCard(Mediator mediator) {
8+
super(mediator);
9+
}
10+
11+
/**
12+
* 播放音频
13+
*
14+
* @param data 音频数据
15+
*/
16+
public void soundPlay(String data) {
17+
System.out.println("音频: " + data);
18+
}
19+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.company.mediator.model;
2+
3+
4+
//抽象同事
5+
public abstract class Colleague {
6+
protected Mediator mediator;
7+
8+
public Colleague(Mediator mediator) {
9+
this.mediator = mediator;
10+
}
11+
12+
/**
13+
* 同事角色的具体行为,由子类实现
14+
*/
15+
public abstract void action();
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.company.mediator.model;
2+
3+
public class ConcreteColleagueA extends Colleague {
4+
public ConcreteColleagueA(Mediator mediator) {
5+
super(mediator);
6+
}
7+
8+
@Override
9+
public void action() {
10+
System.out.println("ColleagueA 将信息递交给中介者处理");
11+
}
12+
}

0 commit comments

Comments
 (0)