从王者荣耀看设计模式(远程代理模式)

一.简介
每位王者荣耀玩家都有一个属于自己的游戏账号。为了提升游戏等级或者增加游戏体验感,会存在多个游戏玩家同时共享一个游戏账号的情况。当一位玩家使用账号正在游戏中时,另一玩家登陆同一账号会导致前一玩家强制退出登陆!(ಥ_ಥ)
模式动机
在本实例中,通过远程代理,我们可以实现远程控制。当我处于在线状态时,使用代理让同一账号的使用者下线
二.远程代理(帮助我们控制访问远程对象)
远程代理可以作为另一个JVM上对象的本地代表。调用代理的方法,会被代理利用网络转发到远程执行,并且结果会通过网络返回给代理,再由代理将结果返回给客户。
代理,就是代表某一真实对象,假装它是真正的对象。但是其实一切的动作是代理对象利用网络和真正的对象沟通o(´^`)o 代理之所以需要控制访问,是因为我们的客户不知道如何和远程对象沟通。从某些方面来看,远程代理控制访问,可以帮助我们处理网络上的细节
变量只能引用和当前代码语句在同一堆空间中的对象,Java有内置远程调用的功能可以帮助我们实现远程代理
三.结构图

四.设计类图

五.代码实现
AccountStatus类(远程接口类)
package com.practice.MyRemote;
import java.rmi.Remote;
import java.rmi.RemoteException;
/*
* 客户端和服务端统一的接口,只需要服务端根据这个接口实现相应的功能,然后注册上去,
* 客户端就可以根据这个接口来使用相应的功能
*
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
*/
public interface AccountStatus extends Remote {
public void OnlineStatus() throws RemoteException;//玩家在线状态
public void OfflineStatus() throws RemoteException;//玩家下线状态
}
AccountStatusHelper(接口实现类<代理>)
package com.practice.MyRemote.Imple;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import com.practice.MyRemote.AccountStatus;
public class AccountStatusHelper extends UnicastRemoteObject implements AccountStatus {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unused")
private boolean Online = false;
public AccountStatusHelper(boolean _Online) throws RemoteException {
this.Online = _Online;
}
@Override
public void OnlineStatus() throws RemoteException {
System.out.println("玩家1正使用账号游戏中……");
}
@Override
public void OfflineStatus() throws RemoteException {
System.out.println("玩家1退出王者荣耀账号!");
}
}
Server(服务类)

本文通过王者荣耀场景讲解了远程代理设计模式,利用Java RMI创建了一个远程接口AccountStatus,实现游戏账号的在线和下线状态控制。服务端创建并注册远程对象,客户端通过查找RMI注册表获取代理对象,从而调用远程方法。远程代理模式简化了客户端与远程对象的交互,隐藏了网络通信细节。
最低0.47元/天 解锁文章
4916

被折叠的 条评论
为什么被折叠?



