Unity游戏开发中常用设计模式之代理模式
什么是代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。它为其他对象提供一种代理以控制对这个对象的访问, 在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
代理模式的优点是用户都基于代理来访问服务,使得背后的服务特性可以变得非常的灵活,也可以随时可以替换服务,用户也不用管。
一个典型的设计案例了解代理模式
给大家上一个代理模式的典型的架构与设计。比如我们要开发一个视频播放器,视频播放器会涉及很多的视频格式的解码,如h264, mp4, h263等。这个时候我们就可以做一个代理,代理,代理提供视频播放器的解码视频数据的接口,用户只要调用代理这个接口,就可以将编好的视频数据,变成原始的视频数据。所以对于用户而言,都是基于代理的,不用管是mp4, h264编码。对于代理内部而言,它会根据类型,来具体使用对应的解码器,实际上是代理包含了具体的视频解码器对象来完成对应的解码,但是对外的用户不用管。如果有新的视频解码格式需要支持,那么只需要增加一个内部的对象来处理就可以了,不用动用户的接口。如图:
伪代码可以这样写
public class VideoDecoderProxy {
void RegisterVideoDecoder(int videoType, VideoDeoder decoder);
void InitWithVideoType(int videoType); // 根据视频的类型,初始化代理的具体解码者
RawImage DecodeData(byte[] videoDatas);
};
运行启动的时候:
VideoDecoderProxy proxy; //代理对象
proxy. RegisterVideoDecoder(mp4Type, mp4Decoder);
proxy. RegisterVideoDecoder(h264Type, h264Decoder);
proxy. RegisterVideoDecoder(h263Type, h263Decoder);
… 如果扩展了新的视频格式,注册一个就可以了;
//
当播放器开发者来调用视频解码库的时候,只要调用视频解码库代理的接口,
proxy. InitWithVideoType(具体类型);
每一帧的视频解码调用 proxy. DecodeData(videoDatas);
这样无论要支持多少总不同的视频格式,播放器的逻辑都不用动,只要添加新的解码库就可以了。
代理模式在游戏开发中的使用
经过上面的例子和伪代码的讲解,相信你对代理模式有了一个比较深刻的认识,接下来我们来分享一个代理模式在游戏开发设计中的经典案例。当我们开发网络游戏的时候,我们的客户端要与服务器进行通讯,而服务器分布在云端的不同的机器上,同时随着服务器部署的变化,我们也会要修改访问服务器的方式和方法。一般做这类客户端网络设计的时候,我通常会采用代理模式,把云端的每个服务抽象成代理,比如用户登录AuthProxy, 系统商城的MallProxy, 逻辑服LogicProxy。这些Proxy提供对应的服务的接口给上层的开发者来使用,如Connect, Login等,Proxy内部来实现具体的部署和通讯细节,比如AuthProx我们要连接哪里,游客登录的具体通讯协议数据是什么等。通过代理,把与游戏服务器通讯部署等的变化与上层的业务逻辑分离出来。
这样服务器的数据通讯变化,部署变化,不同的项目,都不会影响到上层的业务逻辑,只要修改服务器代理的配置就可以了。这样做到了最大限度的灵活性,把变化的东西隔离开来。
本期的Unity游戏开发代理模式就讲解到这里,关注我,继续分享更多的设计模式