Hessian源码已经分析完了,在Hessian中主要使用到了两个设计模式,一个是策略模式,一个是模板方法模式
我们先来看看策略模式
在Hessian中向流中写数据都是通过Serializer接口的writeObject方法来实现的,而根据写出的对象的不同对应着很多的具体的实现类,类图如下(只画出了部分实现类)
因为对于不同类型的参数写出到输出流的方式是不一样的,如果用if...else...来实现的话,每增加一种新的类型都要修改,不仅容易出错而且不易维护
策略模式的使用场景如下
多个类只有在算法或者行为上稍有不同
策略模式的优点如下
1、策略可以自由切换:只要实现抽象策略,就可以成为策略家族的一个成员,通过角色对其封装,保证对外提供“可自由切换”的策略
2、避免使用多重条件判断:多重条件判断极容易出错,尤其是在具体策略逻辑复杂的情况下
3、扩展性良好:在现有的系统中增加一个策略只要实现接口就可以了,其他都不用修改,类似于一个可反复拆卸的插件
模板方法模式
HessianOutput类的call()方法负责将rpc调用过程中的方法信息和参数信息写到流中,代码如下
public void call(String method, Object []args)
throws IOException
{
int length = args != null ? args.length : 0;
startCall(method, length);
for (int i = 0; i < length; i++)
writeObject(args[i]);
completeCall();
}
对于所有的rpc调用在写出方法信息上和写结尾信息上都是没有区别的,只有在写出具体参数的实现是不一样的,所以Hessian将写出方法信息放到了startCall方法中,结尾信息放到了completeCall()方法中,而具体的参数放到了writeObject()方法放到具体的子类中实现
模板方法的使用场景如下
1、多个子类有公有的方法,并且逻辑基本相同时
2、重要,复杂的算法,可以把核心算法设计为模板放方法,周边的相关细节功能由各个子类实现
模板方法的优点如下
1、封装不变部分,扩展可变部分
2、提取公共部分代码,便于维护
3、行为由父类控制,子类提供具体实现