/*
* 中介者模式
* 优点
* 减少类间的依赖
* 缺点
* 关联的对象越多逻辑越复杂,中介类越膨胀
*/
public class MyMain {
public static void main(String[] args) {
// 实例一个中介
AbstractInterMediary mediary = new InterMediary();
// 实例一个老一的买房者
BuyHouseMan buyHouseMan = new BuyHouseMan(mediary);
buyHouseMan.setName("老一");
// 实例一个老二卖房者
SellHouseMan sellHouseMan = new SellHouseMan(mediary);
sellHouseMan.setName("老二");
// 买房者要求购买房价8000
buyHouseMan.setNumber(8000);
// 委托中介
buyHouseMan.mediary.execute("BuyHouse", buyHouseMan);
// 卖房者要求购买房价9000
sellHouseMan.setNumber(9000);
// 委托中介
sellHouseMan.mediary.execute("SellHouse", sellHouseMan);
// 实例一个老三的买房者
BuyHouseMan buyHouseMan2 = new BuyHouseMan(mediary);
buyHouseMan2.setName("老三");
// 买房者要求购买房价10000
buyHouseMan2.setNumber(10000);
// 委托中介
buyHouseMan2.mediary.execute("BuyHouse", buyHouseMan2);
// 实例一个老四卖房者
SellHouseMan sellHouseMan2 = new SellHouseMan(mediary);
sellHouseMan2.setName("老四");
// 卖房者要求购买房价10000
sellHouseMan2.setNumber(10000);
// 委托中介
sellHouseMan2.mediary.execute("SellHouse",sellHouseMan2);
}
}
// 抽象房中介
abstract class AbstractInterMediary {
// 购房角色
protected BuyHouseMan buyHouseMan;
// 卖房角色
protected SellHouseMan sellHouseMan;
// 手头买房者资源
ArrayList<BuyHouseMan> buyHouseManList = new ArrayList<>();
// 手头卖房者资源
ArrayList<SellHouseMan> sellHouseManList = new ArrayList<>();
public AbstractInterMediary() {
buyHouseMan = new BuyHouseMan(this);
sellHouseMan = new SellHouseMan(this);
}
// 中介者最重要的方法叫做事件方法,处理多个对象之间的关系(交易)
public abstract void execute(String str, Object... objects);
}
// 抽象交易角色
abstract class AbstractColleague {
// 交易角色姓名
private String name = "匿名";
// 价格(买房/卖房)
private int number = 0;
protected AbstractInterMediary mediary;
public AbstractColleague(AbstractInterMediary mediary) {
this.mediary = mediary;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
}
// 具体的交易角色购房者
class BuyHouseMan extends AbstractColleague {
public BuyHouseMan(AbstractInterMediary mediary) {
super(mediary);
}
}
// 具体的交易角色卖房者
class SellHouseMan extends AbstractColleague {
public SellHouseMan(AbstractInterMediary mediary) {
super(mediary);
}
}
// 具体的房中介
class InterMediary extends AbstractInterMediary {
// 初始化资源
public InterMediary() {
for (int i = 0; i < 10; i++) {
BuyHouseMan buyHouseMan = new BuyHouseMan(this);
buyHouseMan.setName("买房" + i + "号");
buyHouseMan.setNumber(i * 1000);
buyHouseManList.add(buyHouseMan);
SellHouseMan sellHouseMan = new SellHouseMan(this);
sellHouseMan.setName("卖房" + i + "号");
sellHouseMan.setNumber(i * 1000);
sellHouseManList.add(sellHouseMan);
}
}
// 交易
@Override
public void execute(String str, Object... objects) {
if (str.equals("BuyHouse"))// 买房
this.buyHouse((BuyHouseMan) objects[0]);
else if (str.equals("SellHouse")) // 卖房
this.sellHouse((SellHouseMan) objects[0]);
}
// 买房交易
private void buyHouse(BuyHouseMan buyHouseMan) {
System.out.println("中介:有买房者" + buyHouseMan.getName() + ",要求买房价:" + buyHouseMan.getNumber() + ",寻找手头上匹配的卖方者");
for (int i = 0; i < sellHouseManList.size(); i++) {
if (sellHouseManList.get(i).getNumber() == buyHouseMan.getNumber()) {
System.out.println("找到卖房者:" + sellHouseManList.get(i).getName() + ",正好在卖价值" + buyHouseMan.getNumber()
+ "的房,交易达成。移除手头该资源");
sellHouseManList.remove(i);
System.out.println("---------------------");
break;
}
if (i == sellHouseManList.size() - 1) {
System.out.println("手头上没有该价值的卖房者,将买房者信息加入手头资源");
buyHouseManList.add(buyHouseMan);
System.out.println("---------------------");
break;
}
}
}
// 卖房交易
private void sellHouse(SellHouseMan sellHouseMan) {
System.out.println("中介:有卖房者" + sellHouseMan.getName() + ",要求卖房价:" + sellHouseMan.getNumber() + ",寻找手头上匹配的卖方者");
for (int i = 0; i < buyHouseManList.size(); i++) {
if (buyHouseManList.get(i).getNumber() == sellHouseMan.getNumber()) {
System.out.println("找到买房者:" + buyHouseManList.get(i).getName() + ",正好在买价值" + sellHouseMan.getNumber()
+ "的房,交易达成。移除手头该资源");
buyHouseManList.remove(i);
System.out.println("---------------------");
break;
}
if (i == buyHouseManList.size() - 1) {
System.out.println("手头上没有该价值的卖房者,将买房者信息加入手头资源");
sellHouseManList.add(sellHouseMan);
System.out.println("---------------------");
break;
}
}
}
}