电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

项目重构之命令模式


发布日期:2019/2/12
 

项目中有个业务处理类大小K代码看此类差点雷死我如今如要增加业务逻辑大约个吧此类如果随着项目工程的二期三期如次添加逻辑迟早有一天大小达到Mmygod细心研读前人的工作总结发现其中有点可改造的蛛丝马迹(本人很笨别笑我才发现如何改造)

下面我们对业务流程以及涉及的相关类进行介绍Msg代表接受到客户端的一个消息报文消息报文结构消息头+消息体消息头参数固定消息体参数不定下面是一个简单的类图这只是一个模拟场景****Req代表各户端请求类***Rsp代表返回给客户端的参数类实际比此复杂为描述问题我们简单摘除几个类介绍别问我为何这么设计继承类图msg与msgHead是组合关系也许画错了不当之处请指出勿恶语向伤

处理请求Handler类的代码逻辑如下

Java代码

//类中主要方法如下

public void execute(Object object) {

Message message = (Message)object;

int opcode = messagegetOpcode();

int connectId = messagegetConnectId();

//消息头已经解析获取消息体即子类属性字节数组

byte[] bytes = messagegetBytes();

if (opcode == MsgInfoADD_RING) {

// 订购彩铃

orderRing(connectId bytes);

} else if (opcode == MsgInfoPRESENT_RING) {

// 赠送彩铃

presentRing(connectId bytes);

} else if (opcode == MsgInfoDEL_RING) {

// 删除个人铃音

delPersonalRing(connectId bytes);

}

//此处省略n个else if

}

//其他删除赠送与省略的else if中的处理逻辑与之基本相同

private void orderRing(int connectId byte[] bytes) {

//处理方法分为四步具体代码省略

//解析字节数组为订购铃音类

//处理订购关系

//处理结果封装为订购响应类

//发送回客户端

}

//省略presentRingdelPersonalRing等一系列其他方法所有的处理方法参数相同……

鑒于此想到使用命令模式改造此类如果不了解命令模式请阅读相关书籍大话设计模式或设计与模式这里我们仅给出大致的定于与类图

何谓命令模式将一个请求封装为一个对象从而是你可用不同的请求对客户端参数化对请求排队或记录日志以及支持可撤销的操作

Shit这句话很难理解哦那就先别理解了我们看下命令模式的类图然后介绍如何使用命令模式改造上面的elseif

类图先省略上班偷空写的

下面进入正题对Handler小手术开始主要考虑如下

提炼方法

将每个if语句块中的逻辑提取为一个方法这里我们的handler已经实现就是orderRingpresentRingdelPersonalRing……

提炼类

将每个业务处理方法提取为以各类然后对具体类进行抽象提取父类或者接口代码如下

Java代码

public Abstract class Command{

public void execute()

public class OrderRingCommand extends Command {

private Handler hander;

public OrderRingCommand(Handler hander){

thishander = hander;

}

public void execute(int connectId byte[] bytes){

//解析字节数组为订购铃音类

//增加订购关系

//处理结果封装为订购响应类

//发送回客户端

}

/**

* 解析字节数组为订购铃音类

*/

public void method(){

}

/**

* 处理订购关系

*/

public void method(){

}

/**

* 处理结果封装为订购响应类

*/

public void method(){

}

/**

* 结果发送回客户端

*/

public void method(){

}

}

public class DelRingCommand extends Command {

private Handler hander;

public DelRingCommand(Handler hander){

thishander = hander;

}

public void execute(int connectId byte[] bytes){

//解析字节数组为订购铃音类

//删除购关系

//处理结果封装为订购响应类

//发送回客户端

}

//提取方法

}

命令模式改造替换elseif

Java代码

Map<Integer Command> map = new HashMap<IntegerCommand>();

static{

mapput(MsgInfoADD_RING new OrderRingCommand());

//省却其他这里仅为演示实际项目中实例化类通过spring容器或者其他方法

}

public void execute(Object object) {

Message message = (Message)object;

int opcode = messagegetOpcode();

int connectId = messagegetConnectId();

//消息头已经解析获取消息体即子类属性字节数组

byte[] bytes = messagegetBytes();

mapget(opcode)execute(connectIdbytes);

}

命令模式替换else if代码坏味道的重构结束众多的if条件块烟消云散取而代之的是一个个精简的类

上一篇:动态代理

下一篇:JVM语言Ioke:直观的语法,Lisp与Ruby的力量