前言:【】——————————by xingoo
模式意图
使用一个中介的对象,封装一组对象之间的交互,这样这些对象就可以不用彼此耦合。
这个中介者常常起着中间桥梁的作用,使其他的对象可以利用中介者完成某些行为活动,因此它必须对所有的参与活动的对象了如指掌!
应用场景
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 Colleague1this 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!哎呀我想要!