中介者模式

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挂机,将受到系统惩罚
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值