我将用古代语言编写的游戏移植到javascript / node。我对服务器/客户端部分的初步计划是为服务器和客户端创建一个单独的类。对于服务器,我扩展EventEmitter
,创建并存储net.Server
对象作为成员变量,并在我的类上公开listen方法。
我遇到设计问题的地方是客户。 net.Socket
由net.createServer
函数创建并传递到我的回调中:
const server = net.createServer(socket => {
// somehow turn socket into a Client object here
// let client = new Client(socket); ???
});
所以我最初的想法是将此套接字作为构造函数arg传递到我的Client
类中:
class Client extends EventEmitter {
constructor(socket) {
super();
this._socket = socket;
}
// example wrapper method
write(buff) {
debug(/* print the buffer in hex */);
this._socket.write(buff);
}
// example new method
sendMessage(message) {
let buff = Buffer.alloc(4 + message.length);
buff.writeInt32LE(message.length);
buff.write(message);
this.write(buff);
}
// other methods
}
但是我发现自己在内部套接字上写了很多包装器方法。这让我觉得我真正想要的是让Client
成为net.Socket的超类。但是我必须以某种方式"演员" Server
创建到我的Client
类的套接字。问题是Client
的构造函数设置了一些状态变量,如果我只是"施放"那么这个套接字就不会有。它到我的Client
课程。
对于这种情况,是否有普遍接受的设计模式?情况是我想用尽可能最干净的新方法和状态来扩展现有对象。我一直在考虑其他选择,但我无法决定是否有更好的选择: