抽时间学习了Arthur讲师的模板模式的课程,课程虽然很短,但老师讲得非常清楚,当然这个模板模式看起来也比较简单。为了记的牢固,正好写个手记记录一下。
模板模式原理
模板模式及基于JAVA中的继承技术来实现的。父类定义了一个整体的业务流程,父类实现了这些流程的调用顺序的方法,这个方法不可被重写的,方法定义前要加final。同时业务逻辑中通用的部分,在父类实现,个性化的实现交给子类。
什么情况下使用模板方法
如果不知道什么情况下要使用模板方法,就先梳理自己要实现的业务逻辑。比如在实际运维过程中,现在有个自动化运维任务,就是一键重启weblogic。我们维护了100多套中间件,启动的流程相同,但是有weblogic、was、tomcat等不同,同时启动也分两个场景,一个是计划重启,一个是故障下重启,他们的启动方法不同。我们可以将一键重启的逻辑总结如下:
计划内的正常重启
1、读取配置文件(通用)
2、关闭中间件
3、切换中间件日志(将原来的日志改名)
4、启动中间件
5、验证中间件是否完成启动
故障下的启动:
1、读取配置文件(通用)
2、自动收集中间件运行信息(线程、环境信息输出)(通用)
3、关闭中间件
4、切换中间件日志(将原来的日志改名)
5、启动中间件
6、验证中间件是否完成启动
可以看出,一键启动,故障下的启动,多出一个信息收集,这个在实际的生产环境中,主要指的是线程信息的收集,方便对故障进行分析。其他流程都相同,信息采集正好可以使用钩子来实现。
分析完成后,剩下的就是实现的代码了。
父类:
public abstract class MiddlewareRestart {
/*
- 重启流程
-
*/
public final void restart() {
readConfig();//读配置if ( execGetThread()) { getThread();//收集线程 } stop();//停止 renameLog();//改名 start();//启动 isrun();//验证
}
/* - 读取配置
-
*/
private void readConfig() {
System.out.println("读取了环境信息!");
}
//关闭中间件
abstract void stop();
//修改中间件日志名称,重启后中间件日志建立新的日志文件
abstract void renameLog();
//启动中间件
abstract void start();
//验证中间件运行情况
abstract void isrun();private void getThread() {
System.out.println("进程:已经执行了三次 kill -3 命令");
}
//是否收集线程,默认不收集
boolean execGetThread(){
return false;
}
}
tomcat 重启子类
public class TomcatRestart extends MiddlewareRestart {
boolean p;
public TomcatRestart(boolean parameter){
p=parameter;
}
@Override
void stop() {
System.out.println("tomcat:停止中");
}
void renameLog() {
System.out.println("tomcat:备份修改日志名称");
}
@Override
void start() {
System.out.println("tomcat:启动中");
}
/* (non-Javadoc)
* @see com.middleware.restart.MiddlewareRestart#isrun()
*/
@Override
void isrun() {
System.out.println("tomcat:验证启动正常");
}
/**
*p 为true,收集线程信息,为false不收集线程信息
*/
@Override
boolean execGetThread(){
return p;
}
}
测试类:
public class TomcatRestartTest {
/**
* @方法: main
* @描述: TODO(这里用一句话描述这个方法的作用)
* @参数 @param args 设定文件
* @返回类型 void 返回类型
* @抛出异常
*/
public static void main(String[] args) {
System.out.println("-----------------tomcat正常启动");
MiddlewareRestart m = new TomcatRestart(false);
m.restart();
System.out.println("-----------------tomcat故障启动");
MiddlewareRestart m1 = new TomcatRestart(true);
m1.restart();
}
}
其他子类如tomcat一样。模式说到底还是一个方法论。业务理清楚了,也许我们不知道模板模式,也能写出这样的模式。
共同学习,写下你的评论
评论加载中...
作者其他优质文章