1.定义
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。
2.场景
玩王者荣耀等游戏时,可以在游戏过程中和其他的玩家对话,系统在特定时间也会发系统消息,一般地做法是每个玩家维护一个当前游戏中的所有玩家列表,但是这样操作就比较复杂并且耦合度比较高,这时可以通过中介者模式
将所有玩家的交互有一个中心控制,只要这个中心记录玩家列表,就可以操作所有玩家的信息。
2.1 抽象中介者
public abstract class AbstractChatController {
protected List<Player> redPlayerList = new ArrayList<>();
protected List<Player> bluePlayerList = new ArrayList<>();
protected SystemChat systemChat;
private boolean ready() {
return systemChat != null;
}
public void addSystem(SystemChat systemChat) {
this.systemChat = systemChat;
}
abstract void doSystemSendAll(String message);
private void checkSystem() {
if (!ready()) {
throw new IllegalStateException();
}
}
/**
* 系统发送所有人
*/
protected void systemSendAll(String message) {
checkSystem();
doSystemSendAll(message);
}
/**
* 玩家发送给所有人
*
* @param player
* @param message
*/
public void playerSendAll(Player player, String message) {
checkSystem();
doPlayerSendAll(player, message);
}
protected abstract void doPlayerSendAll(Player player, String message);
/**
* 系统发送给某阵营的人
*/
public void systemSendCamp(CampEnum campEnum, String message) {
checkSystem();
doSystemSendCamp(campEnum, message);
}
protected abstract void doSystemSendCamp(CampEnum campEnum, String message);
/**
* 玩家发送当前阵营的人
*/
public void playerSendCamp(Player player, String message) {
checkSystem();
doPlayerSendCamp(player, message);
}
protected abstract void doPlayerSendCamp(Player player, String message);
/**
* 加入一个玩家
*/
public void addRedPlayer(Player player) {
redPlayerList.add(player);
}
public void addBluePlayer(Player player) {
bluePlayerList.add(player);
}
protected boolean redPlayer(Player player){
return redPlayerList.contains(player);
}
protected boolean bluePlayer(Player player){
return bluePlayerList.contains(player);
}
}
2.2 具体中介者
public class ChatController extends AbstractChatController {
@Override
void doSystemSendAll(String message) {
for (Player p : redPlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), systemChat.getName(), message));
}
for (Player p : bluePlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), systemChat.getName(), message));
}
}
@Override
protected void doPlayerSendAll(Player player, String message) {
for (Player p : redPlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), player.getName(), message));
}
for (Player p : bluePlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), player.getName(), message));
}
}
@Override
protected void doSystemSendCamp(CampEnum campEnum, String message) {
switch (campEnum) {
case RED:
for (Player p : redPlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), systemChat.getName(), message));
}
break;
case BULE:
for (Player p : bluePlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), systemChat.getName(), message));
}
break;
default:
throw new IllegalStateException();
}
}
@Override
protected void doPlayerSendCamp(Player player, String message) {
if (redPlayer(player)) {
for (Player p : redPlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), player.getName(), message));
}
} else {
for (Player p : bluePlayerList) {
System.out.println(String.format("玩家[%s]您收到一条[%s]发来的信息:%s", p.getName(), player.getName(), message));
}
}
}
}
2.3 系统消息
将系统消息也有中介者控制,就能轻松实现系统消息推送
@Data
@AllArgsConstructor
public class SystemChat {
private String name;
}
2.4 玩家和阵营枚举
@Data
@AllArgsConstructor
public class Player{
private String name;
}
/**
* 角色阵营枚举
*/
public enum CampEnum {
RED(1, "红方"),
BULE(2, "蓝方");
CampEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
private Integer code;
private String message;
public String getMessage() {
return message;
}
public Integer getCode() {
return code;
}
}
2.5 测试
public class TestMediator {
public static void main(String[] args) {
ChatController chatController = new ChatController();
Player player1 = new Player("player1");
Player player2 = new Player("player2");
Player player3 = new Player("player3");
Player player4 = new Player("player4");
Player player5 = new Player("player5");
Player player6 = new Player("player6");
Player player7 = new Player("player7");
Player player8 = new Player("player8");
Player player9 = new Player("player9");
Player player10 = new Player("player10");
chatController.addBluePlayer(player1);
chatController.addBluePlayer(player2);
chatController.addBluePlayer(player3);
chatController.addBluePlayer(player4);
chatController.addBluePlayer(player5);
chatController.addRedPlayer(player6);
chatController.addRedPlayer(player7);
chatController.addRedPlayer(player8);
chatController.addRedPlayer(player9);
chatController.addRedPlayer(player10);
chatController.addSystem(new SystemChat("系统通知"));
chatController.doPlayerSendAll(player1,"这游戏很好玩");
System.out.println("--------------------");
chatController.doPlayerSendCamp(player5,"兄弟们,你们玩了多久啦");
System.out.println("--------------------");
chatController.doSystemSendAll("最新游戏活动:充值返现高达100%,赶紧加入吧!!!!");
System.out.println("--------------------");
chatController.doSystemSendCamp(CampEnum.RED,"系统检测到玩家player10挂机,将受到系统惩罚");
}
}
----------------------------console
玩家[player6]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player7]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player8]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player9]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player10]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player1]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player2]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player3]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player4]您收到一条[player1]发来的信息:这游戏很好玩
玩家[player5]您收到一条[player1]发来的信息:这游戏很好玩
--------------------
玩家[player1]您收到一条[player5]发来的信息:兄弟们,你们玩了多久啦
玩家[player2]您收到一条[player5]发来的信息:兄弟们,你们玩了多久啦
玩家[player3]您收到一条[player5]发来的信息:兄弟们,你们玩了多久啦
玩家[player4]您收到一条[player5]发来的信息:兄弟们,你们玩了多久啦
玩家[player5]您收到一条[player5]发来的信息:兄弟们,你们玩了多久啦
--------------------
玩家[player6]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player7]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player8]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player9]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player10]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player1]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player2]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player3]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player4]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
玩家[player5]您收到一条[系统通知]发来的信息:最新游戏活动:充值返现高达100%,赶紧加入吧!!!!
--------------------
玩家[player6]您收到一条[系统通知]发来的信息:系统检测到玩家player10挂机,将受到系统惩罚
玩家[player7]您收到一条[系统通知]发来的信息:系统检测到玩家player10挂机,将受到系统惩罚
玩家[player8]您收到一条[系统通知]发来的信息:系统检测到玩家player10挂机,将受到系统惩罚
玩家[player9]您收到一条[系统通知]发来的信息:系统检测到玩家player10挂机,将受到系统惩罚
玩家[player10]您收到一条[系统通知]发来的信息:系统检测到玩家player10挂机,将受到系统惩罚