设计模式之——中介者设计模式
来源:互联网 发布:weego我去旅行 知乎 编辑:程序博客网 时间:2024/05/17 06:17
定义了一个中介对象来封装一系列对象之间的交互关系。中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为。
说白了就是:一系列对象的交互交给中介者处理,各对象之间完全不依赖。
实际生活中,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】
- 设计模式之——中介者设计模式
- 设计模式之五——中介者模式
- C#设计模式之18——中介者模式
- 学习设计模式之禅——中介者模式
- 《设计模式之禅》——中介者模式
- 设计模式之禅——中介者模式
- 23种设计模式之——中介者模式
- Android设计模式之——中介者模式
- 设计模式——中介者模式
- 设计模式——中介者模式
- 设计模式——中介者模式
- 设计模式——中介者模式
- 设计模式——中介者模式
- 设计模式—Mediator中介者模式
- 大话设计模式—中介者模式
- Java设计模式—中介者模式
- 设计模式之中介者
- 设计模式 之 中介者
- php java go RSA加密解密,加签验签
- 最新致远OA A8-V6.0sp1集团版M1移动oa系统破解,兼有注册机
- sublime Text3 支持vue 语法高亮
- 376. Wiggle Subsequence
- PymongoDB报错MongoError: The dotted field .. is not valid for storage
- 设计模式之——中介者设计模式
- centos7搭建docker本地regsitry
- Adobe Creative Cloud一直转圈无法进入的问题
- 前端精选文摘:BFC 神奇背后的原理
- CentOS6.5搭建asterisk及配置软电话
- 使用 java8 实现List到Array的转换
- 升级curl
- Python切片
- c语言--两个叹号连用