从王者荣耀看设计模式(二十一.中介者模式)

从王者荣耀看设计模式(中介者模式)

一.简介

在王者荣耀中,有一个简单的聊天室,在聊天室中。玩家点击综合可以与全服的玩家发送消息,点击好友可向指定好友玩家私发信息。|??ω?` )

二.模式动机

联合国是一个协调组织,各个国家就一些共同问题经由联合国进行协商,它取代了原本各个国家之间的直接交流,将各个成员国之间的强耦合关系转换为较为松散的耦合关系。在软件开发中,我们有时候也会需要使用类似联合国一样的中间对象来降低系统中类与类,对象与对象之间的耦合关系。
在本实例中,玩家与玩家多对多的通信,导致用户之间存在很强的关联性,将导致系统结构复杂、对象重用性差、系统扩展性低等问题,为了减少对象两两之间复杂的引用关系,使用中介者模式,使之成为一个松耦合的系统

三.中介者模式

中介者模式(Mediator Patern):用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,属于对象行为型模式

中介者模式的应用场景
在以下情况中可以使用中介者模式
■ 系统对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
■ 一个对象由于引用了很多对象而且直接和这些对象通信,导致难以复用该对象
■ 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类,可以通过引入中介者类来实现,在中介者类中定义对象之间交互的共同行为,如果需要改变行为则可以增加新的中介者类

中介者模式的通用类图

中介者模式涉及的角色
中介者模式包含以下角色:
⑴.抽象中介者类(Mediator):抽象中介者用于定义一个接口,该接口用于与各同事对象之间的交互
⑵.具体中介类(ConcreteMediator):具体中介类是抽象中介类的子类,通过协调各个同事类来实现协作行为,了解并维护它对各个同事对象的引用
⑶.抽象同事类(Colleague):通用同事类定义各同事的公有方法
⑷.具体同事类(ConcreteColleague):具体同事类是抽象同事类的子类,每个同事对象都引用一个中介者对象;每个同事对象要与其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信

中介者模式优点:
⑴.简化了对象之间的交互。用中介者和同事的一对多交互替代了原来同事之间的多对多交互,将原来难以理解的网状结构转换为相对简单的星状结构
⑵.将各同事解耦。我们可以独立的改变复用各同事和中介者
⑶.减少子类生成。中介者将原来分布于多个对象间的行为集中在一起

中介者模式缺点:
在具体中介者类中包含了同事之间的交互细节,可能导致具体中介类非常复杂,使系统难以维护

四.结构图

五.设计类图

六.代码实现

创建抽象中介者类(Mediator)

package com.practice.Mediator;

import java.util.ArrayList;
import java.util.List;

import com.practice.User.Player;

public abstract class Mediator {
    List<Player> list = new ArrayList<>();//所有在聊天室里的人存这
    public abstract void sendToAll(String msg,String name);//群发
    public abstract void sendToPerson(String msg,String toName,String fromName);//给某个人发送信息
    public abstract void join(Player player);//用户加入聊天室
    public abstract void leave(Player player);//用户离开聊天室
}

Mediator作为抽象中介者类,它定义了加入和离开聊天室的方法,群发和私发消息的方法
创建具体中介者类(ChatPlatform)

package com.practice.Mediator;

import com.practice.User.Player;
/*
 * 创建具体中介者类
 */
public class ChatPlatform extends Mediator {
    @Override
    //通过中介者向所有同事类发送msg
    public void sendToAll(String msg,String name) {
        for(Player play:list) {
            if(play.name.equals(name)) {
                return;
            }
            play.accept(msg,name);
        }
    }

    //通过中介者向指定玩家私发消息
    @Override
    public void sendToPerson(String msg, String Toname,String fromName) {
        for(Player player:list) {
            if(player.name.equals(Toname)) {
                player.accept(msg,fromName);
            }
        }
    }

    //玩家加入聊天室
    @Override
    public void join(Player player) {
        list.add(player);
    }

    //玩家离开聊天室
    @Override
    public void leave(Player player) {
        list.remove(player);
    }
}

ChatPlatform类是具体中介者类,作为具体聊天室,它实现了在抽象聊天室中定义的抽象方法,实现了消息传递。中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象之间的交互进行进一步控制

创建同事类(Player)

package com.practice.User;

import com.practice.Mediator.Mediator;

public class Player {
    public Mediator mediator;
    public String name;
    //在创建对象的时候就把他的中介者传入,他要发送 的都通过这个中介者完成
    public Player(String name,Mediator mediator) {
        this.mediator = mediator;
        this.name = name;
    }
    //给所有人发送信息
    public void sendtoAll(String msg,String name) {
        mediator.sendToAll(msg,name);
    }
    //给某人发送信息
    public void sendToPerson(String msg,String toName,String fromName) {
        mediator.sendToPerson(msg,toName,fromName);
    }
    //接收信息
    public void accept(String msg,String fromName) {
        System.out.println("[" + this.name + "]收到消息:(" + fromName + ")" + msg);
    }
    //加入聊天室
    public void join() {
        mediator.join(this);
    }
    //离开聊天室
    public void leave() {
        mediator.leave(this);
    }
}

测试类(Client)

package com.practice.client;

import com.practice.Mediator.ChatPlatform;
import com.practice.Mediator.Mediator;
import com.practice.User.Player;

public class Client {
    public static void main(String[] args) {
        //实例化聊天室
        Mediator chatPlatform = new ChatPlatform();
        //创建多个玩家
        Player a = new Player("妙乌",chatPlatform);
        Player b = new Player("蒸血Stack",chatPlatform);
        Player c = new Player("美团骑手牛笔",chatPlatform);
        Player d = new Player("吗咿呀嘿",chatPlatform);
        //玩家加入聊天室
        b.join();
        c.join();
        d.join();
        System.out.println("--------妙乌进入聊天室- - - - - - - - - - - -");
        a.join();
        System.out.println("------------妙乌群发消息- - - - - - - - - - - - - - -");
        a.sendtoAll("有需要上分的么?差个辅助",a.name);
        System.out.println("------------妙乌给\"蒸血Stack\"私发信息- - - - - - - - - - - - - -");
        a.sendToPerson("小老弟,一起来开黑", b.name,a.name);
        System.out.println("--------妙乌离开聊天室- - - - - - - - - - -");
    }
}

运行结果:

七.源代码下载

从王者荣耀看设计模式

原文地址:https://www.cnblogs.com/miaowulj/p/12191339.html

时间: 2024-08-06 15:27:55

从王者荣耀看设计模式(二十一.中介者模式)的相关文章

从王者荣耀看设计模式(十六.建造者模式)

从王者荣耀看设计模式(建造者模式) 一.简介 为了玩王者荣耀的游戏体验感,不少玩家都会选择花钱购买自己常用英雄的皮肤.一方面,购买的皮肤通常要比原画更加"炫酷".另一方面,购买的英雄皮肤常常伴随有特殊的回城特效与攻击技能特效. 二.模式动机 不管在生活中还是软件系统中,都存在一个包含多个组成部件的复杂对象,如汽车,它包括车轮.方向盘.发动机等各种部件.组成复杂对象的这些部件之间或许还会一定的约束,若某些属性没有赋值可能无法构成完整产品使用.如,电子邮件包含地址.收件人姓名.联系方式.创

从王者荣耀看设计模式(九.命令模式)

从王者荣耀看设计模式(命令模式) 一.简介 王者荣耀是一款团队竞技游戏.良好的团队信息交流在一定程度上能帮助队伍取得胜利.为了保证游戏的流畅性与便捷性,王者荣耀提供了快捷交流机制,在王者小地图旁边有几个快捷聊天按钮(开始撤退,发起进攻,请求结合),玩家可通过点击快捷聊天按钮发出相应命令与队友进行交流 二.命令模式 命令模式(Command Pattern):命令模式是一种高内聚的模式,将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.

从王者荣耀看设计模式(虚拟代理模式)

从王者荣耀看设计模式(虚拟代理模式) 一.简介 王者荣耀游戏设置了很多种游戏模式,比如:王者模拟战.无限乱斗.梦境大乱斗.火焰山大战等.当从王者荣耀的主界面进入各类模式的界面时,由于网络原因,会存在一定程度的延时(会有一个圈圈在主界面一直转啊转啊转(??へ??╬)),直到加载完图片,会跳转到各模式界面. 二.虚拟代理(作为创建开销大的对象的代表) 虚拟代理是作为创建开销大的对象的代表.虚拟代理经常直到我们真正需要一个对象的时候才创建它.当对象在创建前和创建中时,由虚拟代理来扮演对象的替身.对象创

从王者荣耀看设计模式(保护代理模式)

从王者荣耀看设计模式(保护模式) 一.简介 打开王者荣耀,点击右上角头像标志可进入我的信息主页.在我的个人主页中,我可以可设置玩家的游戏昵称,性别,常用英雄.除此之外,我还可以查看自己得到别人点赞的次数(不能给自己点赞);其他玩家亦可访问我的主页,可以给我点赞,可以查看我设置的所有信息(不能更改). 二.保护代理(控制用户的访问权限) 保护代理,是提供某些级别的保护,根据客户的权限和决定客户可否访问哪些特定的方法,所以保护代理可能只提供给客户部分接口. 三.Java动态代理 Java在java.

从王者荣耀看设计模式(十四.工厂方法模式)

从王者荣耀看设计模式(工厂方法模式) 二.简介 王者荣耀游戏设计师根据英雄技能.属性.天赋等因素,将英雄划分为射手.辅助.打野.法师.坦克.战士等职业.一局比赛存在多类英雄可供选择.玩家在挑选游戏英雄时,合理的英雄职业搭配是赢得游戏胜利的基本保证. 三.工厂方法模式 工厂方法模式(Factory Method Pattern):工厂方法模式又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式.在

从王者荣耀看设计模式(十七.原型模式)

从王者荣耀看设计模式(原型模式) 一.简介 王者荣耀包含有很多的玩法,其中有一种游戏模式只在周六和周日开放,那就是--克隆模式.与常规的游戏双方阵营只允许出现单一英雄不同,在克隆模式中,双方各选择一个英雄进行克隆,换句话说,一个阵营的五个人操作的五个相同的英雄 二.模式动机 在软件系统中,有些对象的创建过程比较复杂,而且有时候需要频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的意图所在. 三.原型模式 原型模式

设计模式之二十一:中介者模式(Mediator)

中介者模式:定义了一个对象,用来封装一系列对象的交互.中介者模式通过使对象之间不必显式引用降低了对象之间的耦合,并且允许你独立改变它们之间的交互. 中介者模式就是将对象之间的交互封装在了一个独立的对象中,这个独立的对象用来控制对象之间的交互行为,所以这个对象还是蛮复杂的. UML类图: 主要包括: Mediator:定义了一个Colleague对象之间交互的接口. ConcreteMediator:实现了Colleague对象之间的交互行为,并了解和能操作Colleague对象. Colleag

Java设计模式(十一)访问者模式 中介者模式

(二十一)访问者模式 对已存在的类进行扩展,通常需要增加方法,但是如果需要的行为与现有的对象模型不一致,或者无法修改现有代码.在这种情况下,不更改类的层次结构,就无法扩展该层次结构的行为.如果运用了访问者模式,就可以支持开发人员扩展该类层次结构的行为. 和解释器模式一样,访问者模式通常是基于合成模式的. 访问者模式在不改变类层次结构的前提下,对该层次结构进行扩展. interface Visitor{ public void visit(VisiSubject sub); } interface

从王者荣耀谈设计模式?

软件开发中涉及到的设计模式很多,这里重点讨论工作中常见的一些设计模式,围绕王者荣耀中的场景进行展开. 1:策略模式 策略模式demo <?php //1:抽象策略接口:王者荣耀 abstract class kingGlory{ abstract function showTime(); } //2:具体策略角色 //鲁班 class luban extends kingGlory{ public function showTime(){ echo  '猥琐发育,躲坦克后面'; } } //王昭