定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。
说白了就是:一系列对象的交互交给中介者处理,各对象之间完全不依赖。
实际生活中,QQ群,聊天室,游戏大厅,短信平台 都属于这种模式 - 每个用户都不直接依赖其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。
这里有篇文章是说中介者、代理、外观模式之间的比较的,这三个模式还是比较容易混的:http://blog.csdn.net/xdd19910505/article/details/24793099
我们就来模拟一下斗地主结算金豆的功能:为了简化操作,设定只要农民有一个赢了金豆,他的队友也会获得同样的豆子,中国好队友啊,如果一个农民输了就都输,好残酷的游戏
先抽象出玩家
package com.zndroid.dm.MediatorModel.APlayer;
import com.zndroid.dm.MediatorModel.AMediator.Mediator;
/**
* Created by luzhenyu on 2017/9/19.
*/
public abstract class Player {
private int beans;
public int getBeans() {
return beans;
}
public void setBeans(int beans) {
this.beans = beans;
}
public abstract void sweepBeans(Mediator mediator, int count);
}
package com.zndroid.dm.MediatorModel.APlayer;
/**
* Created by luzhenyu on 2017/9/19.
*/
public abstract class ALandowner extends Player {
}
package com.zndroid.dm.MediatorModel.APlayer;
/**
* Created by luzhenyu on 2017/9/19.
*/
public abstract class AFarmer extends Player {
}
抽象中介者,并实例化
package com.zndroid.dm.MediatorModel.AMediator;
import com.zndroid.dm.MediatorModel.APlayer.AFarmer;
import com.zndroid.dm.MediatorModel.APlayer.ALandowner;
/**
* Created by luzhenyu on 2017/9/19.
*/
public abstract class Mediator {
protected AFarmer framer;
protected AFarmer framer1;
protected ALandowner landowner;
public Mediator(AFarmer framer, AFarmer framer1, ALandowner landowner) {
this.framer = framer;
this.framer1 = framer1;
this.landowner = landowner;
}
public abstract void farmerWin(int count);
public abstract void landownerWin(int count);
}
package com.zndroid.dm.MediatorModel.AMediator.impl;
import com.zndroid.dm.MediatorModel.AMediator.Mediator;
import com.zndroid.dm.MediatorModel.APlayer.AFarmer;
import com.zndroid.dm.MediatorModel.APlayer.ALandowner;
/**
* Created by luzhenyu on 2017/9/19.
*/
public class QQMediator extends Mediator {
public QQMediator(AFarmer framer, AFarmer framer1, ALandowner landowner) {
super(framer, framer1, landowner);
}
@Override
public void farmerWin(int count) {
framer.setBeans(framer.getBeans() + count);
framer1.setBeans(framer1.getBeans() + count);
landowner.setBeans(landowner.getBeans() - 2 * count);
log();
checkWinner();
}
@Override
public void landownerWin(int count) {
framer.setBeans(framer.getBeans() - count);
framer1.setBeans(framer1.getBeans() - count);
landowner.setBeans(landowner.getBeans() + 2 * count);
log();
checkWinner();
}
private void checkWinner() {
if (landowner.getBeans() <= 0) {
landowner.setBeans(0);
System.out.println("农民赢!!!");
} else if (framer.getBeans() <= 0 || framer1.getBeans() <= 0) {
framer.setBeans(0);
framer1.setBeans(0);
System.out.println("地主赢!!!");
}
}
private void log() {
System.out.println("----------------------------------------");
System.out.println("frame frame1 landowner");
System.out.print(" " + framer.getBeans() + " ");
System.out.print(framer1.getBeans() + " ");
System.out.print(landowner.getBeans() + " ");
System.out.println("");
System.out.println("----------------------------------------");
}
}
package com.zndroid.dm.MediatorModel.APlayer.impl;
import com.zndroid.dm.MediatorModel.AMediator.Mediator;
import com.zndroid.dm.MediatorModel.APlayer.ALandowner;
/**
* Created by luzhenyu on 2017/9/19.
*/
public class Landowner extends ALandowner {
@Override
public void sweepBeans(Mediator mediator, int count) {
mediator.landownerWin(count);
}
}
package com.zndroid.dm.MediatorModel.APlayer.impl;
import com.zndroid.dm.MediatorModel.AMediator.Mediator;
import com.zndroid.dm.MediatorModel.APlayer.AFarmer;
/**
* Created by luzhenyu on 2017/9/19.
*/
public class Framer extends AFarmer {
@Override
public void sweepBeans(Mediator mediator, int count) {
mediator.farmerWin(count);
}
}
具体使用如下
/**
* 中介者模式
* 定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。
* 优点:
* 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。
* 缺点:
* 中介者会庞大,变得复杂难以维护;中介者一旦挂了,全部瘫痪;新增加一个处理对象时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
* 我们遇到:一组定义良好的对象,现在要进行复杂的相互通信;想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以考虑使用这种模式
*
* 具体应用:
* MVC架构,QQ群,聊天室,游戏大厅,短信平台 - 每个用户都不直接依赖其他用户,只需要依赖这个中间平台就可以了,一切操作都由中间平台去分发。
* */
//斗地主咯~ (三人斗地主 假如每个人都有50颗金豆)
//模拟系统自动结算金豆数(为了简化操作,设定只要农民有一个赢了金豆,他的队友也会获得同样的豆子,中国好队友啊,如果一个农民输了就都输,好残酷的游戏)
//音乐响起:
// ....
// --不要炸的痛
// --输了耍赖
// --明牌你比我快
// --网络人生 戏里戏外
// --霎那间全想开~~~
AFarmer farmer = new Framer();
AFarmer farmer1 = new Framer();
ALandowner landowner = new Landowner();
farmer.setBeans(50);
farmer1.setBeans(50);
landowner.setBeans(50);
QQMediator mediator = new QQMediator(farmer, farmer1, landowner);
//Round 1
farmer.sweepBeans(mediator, 5);
//Round 2
farmer1.sweepBeans(mediator, 10);
//Round 3
landowner.sweepBeans(mediator, 5);
//Round 4
farmer.sweepBeans(mediator, 15);
log("----------------我是分割线-----------------");
运行结果:
[ ======================================== ]
----------------------------------------
frame frame1 landowner
55 55 40
----------------------------------------
----------------------------------------
frame frame1 landowner
65 65 20
----------------------------------------
----------------------------------------
frame frame1 landowner
60 60 30
----------------------------------------
----------------------------------------
frame frame1 landowner
75 75 0
----------------------------------------
农民赢!!!
[ ----------------我是分割线----------------- ]
[ ======================================== ]
【欢迎上码】
【微信公众号搜索 h2o2s2】