设计模式之中介者模式

(各种设计模式的源代码在 https://github.com/mjnjust/Designmode.git ,使用utf8编码)
一、定义
用一个中介者对象封装一系列的对象交互,使各对象不需要显示的相互作用,从而是耦合松散。

 举个例子:战争中十分讲究各个兵种的配合,比如有侦查兵、步兵、炮兵,步兵需要侦查兵去侦查,需要炮兵支援;侦查兵需要确认步兵可以冲锋,炮兵应该轰击;炮兵可以告诉步兵应该冲锋。(只是随便举个例子)
可以画个示意图:
![这里写图片描述](http://img.blog.csdn.net/20151203104228408)
在只有三个兵种的时候似乎示意图还是蛮清楚的,但是真正的战争中怎么可能只有三个兵种或者说三个部队呢?所以聪明的
人就想出了指挥部这样的东西,每个兵种或者部队把自己的需求提交给指挥部,然后让指挥部去调度,而自己对指挥部怎么
调度完全不用管,这样就可以将本来很繁琐的过程简化。
![这里写图片描述](http://img.blog.csdn.net/20151203104327012)

这里的指挥部就是中介者模式中的中介者,当类和类之间的关系出现大量的多对多依赖的时候,就可以考虑用这种模式。

二、实例
以上面步兵侦察兵和炮兵的例子,完成代码。
Soldier的抽象类

public abstract class Soldier {
 Mediator mediator = null ;
 public Soldier(Mediator mediator) {
  this.mediator = mediator ;
 }
}

步兵:

public class FootSoldier extends Soldier{

 public FootSoldier(Mediator mediator) {
  super(mediator);
  mediator.setFootSoldier(this);
 }

 public void work() {
  System.out.println("步兵冲锋!");
 }
 public void needSpy() {
  System.out.println("步兵说:需要侦查!");
  super.mediator.execute("zhengcha");
 }
 public void needBombard() {
  System.out.println("步兵说:需要炮击!");
  super.mediator.execute("paoji");
 }
}

侦查兵:

public class SpySoldier extends Soldier{

 public SpySoldier(Mediator mediator) {
  super(mediator);
  mediator.setSpySoldier(this);
 }
 public void work() {
  System.out.println("侦查兵侦查!");
 }
 public void shouldCharge() {
  System.out.println("侦查兵说:步兵可以冲锋!");
  super.mediator.execute("chongfeng");
 }
 public void shouldBombard() {
  System.out.println("侦查兵说:炮兵可以炮击!");
  super.mediator.execute("paoji");
 }
}

炮兵:

public class ArtillerySoldier extends Soldier{

 public ArtillerySoldier(Mediator mediator) {
  super(mediator);
  mediator.setArtillerySoldier(this);
 }
 public void work() {
  System.out.println("炮兵轰击!");
 }
 public void shoudCharge() {
  System.out.println("炮兵说:步兵可以冲锋!");
  super.mediator.execute("chongfeng");
 }
}

中介者:

public class Mediator {

 private FootSoldier footSoldier ;
 private SpySoldier spySoldier ;
 private ArtillerySoldier artillerySoldier ;

 public FootSoldier getFootSoldier() {
  return footSoldier;
 }
 public void setFootSoldier(FootSoldier footSoldier) {
  this.footSoldier = footSoldier;
 }
 public SpySoldier getSpySoldier() {
  return spySoldier;
 }
 public void setSpySoldier(SpySoldier spySoldier) {
  this.spySoldier = spySoldier;
 }
 public ArtillerySoldier getArtillerySoldier() {
  return artillerySoldier;
 }
 public void setArtillerySoldier(ArtillerySoldier artillerySoldier) {
  this.artillerySoldier = artillerySoldier;
 }

 public void execute(String code) {
  if(code.equals("paoji")){
   this.artillerySoldier.work();
  }else if (code.equals("zhengcha")) {
   this.spySoldier.work();
  }else if (code.equals("chongfeng")) {
   this.footSoldier.work();
  }else {
   System.out.println("指令错误!");
  }
 }

}

测试代码:

Mediator mediator = new Mediator();
  FootSoldier footSoldier = new FootSoldier(mediator);
  ArtillerySoldier artillerySoldier = new ArtillerySoldier(mediator);
  SpySoldier spySoldier = new SpySoldier(mediator);
  footSoldier.needSpy();
  footSoldier.needBombard();

  spySoldier.shouldBombard();
  spySoldier.shouldCharge();

  artillerySoldier.shoudCharge();

运行结果:

步兵说:需要侦查!
侦查兵侦查!
步兵说:需要炮击!
炮兵轰击!
侦查兵说:炮兵可以炮击!
炮兵轰击!
侦查兵说:步兵可以冲锋!
步兵冲锋!
炮兵说:步兵可以冲锋!
步兵冲锋!

你可能感兴趣的:(设计模式-中介者模式)