命令数据解析与构建模式
2012-05-23 07:44:20 来源:WEB开发网核心提示:场景描述有客户端ClientA 和服务器ServerA,他们之间通过自定义协议ProtocolA进行通信,命令数据解析与构建模式,随着业务的发展协议ProtocolA会发展出不同的版本,随着版本的增多可能会出现采用多个协议版本的ClientA共同存在,声明协议解析接口与命令数据(被具体版本的协议包装好的可以进行传输的命
场景描述
有客户端ClientA 和服务器ServerA,他们之间通过自定义协议ProtocolA进行通信,随着业务的发展协议ProtocolA会发展出不同的版本,随着版本的增多可能会出现采用多个协议版本的ClientA共同存在,那么此时ServerA需要对通信协议向下兼容(兼容所有老版本的协议)。
还是上面的内容,ClientA和ServerA通过协议ProtocolA进行命令数据的交互,此时交互的命令可能也会出现多个版本的情况那么此时对于命令也是要做向下兼容的。
在编程实现命令的时候如果按照“命令模式”进行建模,那么在对数据进行解析的时候不会有什么问题,但是在构建符合协议规范的命令数据的时候却不能通过同样的接口获取,而是要在客户代码里直接应用实现类的实例,这样造成的后果是把本已经做好的封装又给破坏掉了。
本文的主要目的就是应对上述三个场景中出现的问题给出的模型,通过此模型的应用可以将命令的实现与客户代码很好的分离。

//
// 以下类仅作示范使用,里面包含的具体实现 和方法定义视情况而定,本代码仅
// 对ICommand在客户代码中的使用的使用做示范
//
interface ICommand
{
void excute(String data);
byte[] getData();
}
// 命令
abstract class AbstractCommand:ICommand
{
// 所有命令的公告代码在此书写
}
// 某命令
class CommandImp:AbstractCommand
{
// 需要实现对该命令所有版本队列的管理,在此创建该命令的职责链
}
abstract class AbstractSubCommand:ICommand
{
// 所有子命令的公告代码在此书写
}
class SubCommandImpV_1_0:AbstractSubCommand
{
// CommandImp的1.0版本的实现
}
abstract class AbstractProtocol:ICommand
{
protected String version;
protected AbstractProtocol protocol = null;
// 装饰模式用于指定被修饰的对象
AbstractProtocol(ICommand command);
// 职责链模式,设置下一个职责对象
void setNext(AbstractProtocol protocol);
}
class ProtocolImpV_1_0:AbstractProtocol
{
// 实现1.0版本的协议
}
// 数据发送
void send(ICommand data)
{
// 在此处并不知道ICommand的具体实现
Socket socket = new Socket("ip","port");
socket.send(data.getData());
}
// 接收数据
void receive(ICommand command)
{
// 在此处并不知道ICommand的具体实现
Socket socket = new Socket("ip","port");
byte[] data = socket.receive();
command.exceue(data.toString());
}
//
// 主要示范通过ICommand的使用进行示范
//
void main()
{
//
// 创建1.0版本的协议对象
// 该协议对象负责解析协议数据,并将解析出来的命令数据转发给相应的命令
//
ICommand protocol = new ProtocolImpV_1_0();
receive(protocol);
//
// 创建命令数据并用相应的协议包装成协议数据,
// 当命令或协议版本升级的时候只需要修改此处创建的创建对象即可,对于客户代码不需要做任何修改
//
send(new ProtocolImpV_1_0(new SubCommandImpV_1_0()));
}
ICommand 命令接口定义,声明协议解析接口与命令数据(被具体版本的协议包装好的可以进行传输的命令数据)获取的接口;
AbstractCommand 命令声明,实现ICommand接口,此抽象类实现对所有命令具体实现的抽象,每个命令的实现负责维护自身所有版本命令的队列;
更多精彩
赞助商链接
