最近在看Template框架,虽然说它不怎么用。但是其中的设计思想还是值得学习的。
1.模板方法模式
模板方法模式主要用于对算法或者行为逻辑进行封装,即如果多了个类中存在相似的算法或者行为逻辑,就可以将这些相似的逻辑提取到模板方法类中实现。然后让相应的子类根据需要实现某些自定义的逻辑
在做课设的时候,发现后台的确是很多类似的。
当时我是统一返回sql语句让,然后有两个执行类:
一个是只执行不用管返回结果(用于insert,delete),
另一个是执行要返回数据(用于select)。
这样也算是简单地体现了模板方法模式,后知后觉哈哈。
在只有JDBC API去访问数据库数据时,就会发现,很多代码都是按照一样的流程下来的。
(1).取得数据库连接connection
(2)从connection创建相应的Statement或者PreparedStatement
(3)将SQL语句给Statement或者PreparedStatement 执行
(4)关闭st ,ps
(5)catch 处理访问异常
(6)finally 关闭connection
因此将它们提取到一个模板里头——》得到Template的雏形。
public abstract class Template {
public final Object execute(String sql) {
Connection con=null;
Statement st=null;
try {
con=驱动器.getConnection();
st=con.createStatement();
Object reValue=executeWithStatement(st,sql);//得到数据
}
catch(SQLException e) {
}
finally {
st.close();
con.close();
}
}
public abstract Object executeWithStatement(String sql,Statement st);
}
以上的都没什么大不了的,常规的抽象类。
但是接下来,Template用了回调接口,多态。就不用每次用的时候就新增一个类。
CallBack接口与模板方法类关系可以看成服务与被服务的关系,模板方法类想要calllback做事,就要提供相应资源(在这里是通过doInStatement方法公开Statement给callback)
callback使用这些资源做事,完事后,模板方法来处理公开资源,callback只是负责运行sql。
Template里调用execute方法的源码步骤:
①在调用execute方法时,并不是直接执行。而是先创建一个Callback接口。
sql语句成为共享资源——在doInStatement方法里被Callback接口调用.并且跳到②方法里
②自己想加什么,可以在doInStatement方法里作出修改。
callback是模板类的一个零件,这个零件可以灵活更换。想变成hellokitty还是米老鼠都可以。这样子不影响模板类的模板排布,而且又能根据需求灵活变换。
2.Strategy设计模式
简单来说就是分而治之。
用一个抽象的总Strategy
根据不同的场景,实现不同的子Strategy。
这样,调用Strategy的主体在后期维护也方便,不用一个个地去改。
只要把实现的子Strategy升级或者直接替换成别的Strategy就可以了。
我感觉和Callback思想的区别在于:
callback思想是,同一类型,或是少量的不同类型 被封装好,直接反调用于主体。
而主题往往是已经定下来的模板。为了避免主题过多改动而用调用callback
Strategy设计思想:涉及的类型可能较多一些,尽量避免了过多的if else判断