设计模式之中介者模式

来源:互联网 发布:淘宝官方正品女装 编辑:程序博客网 时间:2024/06/06 07:03

(各种设计模式的源代码在 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();

运行结果:

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