模式意图
使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。
这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!
应用场景
1 当一组对象要进行沟通或者业务上的交互,但是其关系却又很复杂混乱时,可以采用此模式。
2 当一个对象与其他的对象要进行紧密的交互,但又想服用该对象而不依赖其他的对象时。
3 想创造一个运行于多个类之间的对象,又不想生成新的子类时。
模式结构
Mediator 抽象的中介者,定义中介的规范
interface Mediator{
public void colleagueChanged(Colleague c);
}
ConcreteMediator 具体的中介者,通常内部依赖于多个业务对象
class ConcreteMediator implements Mediator{
private Colleague1 col1;
private Colleague2 col2;
public void colleagueChanged(Colleague c) {
col1.action();
col2.action();
}
public void createConcreteMediator() {
col1 = new Colleague1(this);
col2 = new Colleague2(this);
}
private Colleague1 getCol1() {
return col1;
}
public Colleague2 getCol2() {
return col2;
}
}
Colleague 抽象的业务角色
abstract class Colleague{
private Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public Mediator getMediator() {
return mediator;
}
public abstract void action();
public void change(){
mediator.colleagueChanged(this);
}
}
Colleague1 Colleague2 具体的业务角色
class Colleague1 extends Colleague{
public Colleague1(Mediator m){
super(m);
}
public void action(){
System.out.println("this is an action from Colleague1");
}
}
class Colleague2 extends Colleague{
public Colleague2(Mediator m){
super(m);
}
public void action(){
System.out.println("this is an action from Colleague2");
}
}
全部代码
1 package com.xingoo.test.design.mediator;
2 abstract class Colleague{
3 private Mediator mediator;
4
5 public Colleague(Mediator mediator){
6 this.mediator = mediator;
7 }
8
9 public Mediator getMediator() {
10 return mediator;
11 }
12
13 public abstract void action();
14
15 public void change(){
16 mediator.colleagueChanged(this);
17 }
18 }
19 class Colleague1 extends Colleague{
20 public Colleague1(Mediator m){
21 super(m);
22 }
23 public void action(){
24 System.out.println("this is an action from Colleague1");
25 }
26 }
27 class Colleague2 extends Colleague{
28 public Colleague2(Mediator m){
29 super(m);
30 }
31 public void action(){
32 System.out.println("this is an action from Colleague2");
33 }
34 }
35 interface Mediator{
36 public void colleagueChanged(Colleague c);
37 }
38 class ConcreteMediator implements Mediator{
39 private Colleague1 col1;
40 private Colleague2 col2;
41
42 public void colleagueChanged(Colleague c) {
43 col1.action();
44 col2.action();
45 }
46
47 public void createConcreteMediator() {
48 col1 = new Colleague1(this);
49 col2 = new Colleague2(this);
50 }
51
52 private Colleague1 getCol1() {
53 return col1;
54 }
55
56 public Colleague2 getCol2() {
57 return col2;
58 }
59
60 }
61
62 public class Client {
63 public static void main(String[] args) {
64 ConcreteMediator mediator = new ConcreteMediator();
65 mediator.createConcreteMediator();
66 Colleague1 col1 = new Colleague1(mediator);
67 // Colleague2 col2 = new Colleague2(mediator);
68 mediator.colleagueChanged(col1);
69 }
70 }
运行结果
this is an action from Colleague1
this is an action from Colleague2
生活中的设计模式
毕业的同学们,第一个要解决的问题就是租房子,当白富美高富帅出没社会后,穷屌丝没了生存之地。但是只要勤劳,一样有饭吃有房住!
这里房屋中介好比是一个中介者,它知道每个租客的身份信息,当有房屋出租后,它会发送给每一个租客消息。
这样,租客们中有一个变化活动时,都会利用房屋中介,发送消息到其他的租客。下面就是模仿的一个过程。
房屋中介代码如下:
1 interface StateMediator{
2 public void sell(Tenant tenant);
3 }
4 class RealEstateAgents implements StateMediator{
5 private TenantA teA;
6 private TenantB teB;
7 private TenantC teC;
8
9 public void sell(Tenant tenant) {
10 System.out.println("海景洋房 已经租出去了!");
11 if(tenant instanceof TenantA){
12 teB.crying();
13 teC.crying();
14 }else if(tenant instanceof TenantB){
15 teA.crying();
16 teC.crying();
17 }else if(tenant instanceof TenantC){
18 teB.crying();
19 teA.crying();
20 }
21 }
22
23 public void createAgents(){
24 teA = new TenantA(this);
25 teB = new TenantB(this);
26 teC = new TenantC(this);
27 }
28 }
租客的代码如下:
1 abstract class Tenant{
2 private RealEstateAgents agent;
3 public Tenant(RealEstateAgents agent) {
4 this.agent = agent;
5 }
6 public abstract void crying();
7 public void renting(){
8 agent.sell(this);
9 }
10 }
11 class TenantA extends Tenant{
12 public TenantA(RealEstateAgents agent) {
13 super(agent);
14 }
15 public void crying() {
16 System.out.println("我是高富帅 TenantA!哎呀我想要!");
17 }
18 }
19 class TenantB extends Tenant{
20 public TenantB(RealEstateAgents agent) {
21 super(agent);
22 }
23 public void crying() {
24 System.out.println("我是白富美 TenantB!哎呀我想要!");
25 }
26 }
27 class TenantC extends Tenant{
28 public TenantC(RealEstateAgents agent) {
29 super(agent);
30 }
31 public void crying() {
32 System.out.println("我是穷屌丝 TenantC!哎呀我想要!");
33 }
34 }
产生的业务活动如下:
1 public class ClientTest {
2 public static void main(String[] args) {
3 RealEstateAgents agent = new RealEstateAgents();
4 agent.createAgents();
5
6 System.out.println("TeA 抢到了房子了!");
7 agent.sell(new TenantA(agent));
8
9 System.out.println("过了两个月 TeB 抢到了房子了!");
10 agent.sell(new TenantB(agent));
11 }
12 }
运行结果
TeA 抢到了房子了!
海景洋房 已经租出去了!
我是白富美 TenantB!哎呀我想要!
我是穷屌丝 TenantC!哎呀我想要!
过了两个月 TeB 抢到了房子了!
海景洋房 已经租出去了!
我是高富帅 TenantA!哎呀我想要!
我是穷屌丝 TenantC!哎呀我想要!