内容定位:高级知识点,不太适合接触业务场景比较单一的开发者
模板模式的定义:
模板模式的适用场景:
模式对比:
抽象工厂模式是用接口实现的,当然也可以用抽象类,重点是归纳和总结对象的创建过程;
模板模式使用的是抽象类,在不改变流程的情况下,定制一些个性化的东西,达到出现不同结果的目的。
策略模式是只提供选择权,内部已经定义好所有的流程,没有干预逻辑的权利,关心的是结果;
模板模式关心整个流程实现的过程,可以微调流程和干预逻辑。
模板模式应用场景案例:
案例:网课老师备课需要固定的流程,但是不同的网课课后要求不一样,作业也不一样
网课抽象类
/***@author:ZhouCong*@date:Createin2021/1/1115:23*@description:网课抽象类模板会有一个或者多个未实现的方法,而且这几个未实现方法有着固定的执行顺序*/publicabstractclassNetworkCourse{protectedfinalvoidcreateCourse(){//1、发布预习资料this.postPreResource();//2、制作PPT课件this.createPPT();//3、在线直播this.liveVideo();//4、提交课件、课堂笔记this.postNode();//5、提交源码this.postSource();//6、布置作业,有些课有作业有些课没有作业//如果有作业的话,检查作业,没有作业,完成了if(needHomework()){checkHomework();}}abstractvoidcheckHomework();/***钩子方法:作用实现流程微调*/protectedbooleanneedHomework(){returnfalse;};finalvoidpostSource(){System.out.println("提交源代码");};finalvoidpostNode(){System.out.println("提交课件和笔记");};finalvoidliveVideo(){System.out.println("直播授课");};finalvoidcreatePPT(){System.out.println("创建备课PPT");};finalvoidpostPreResource(){System.out.println("分发预习资料");};}Java课
/***@author:ZhouCong*@date:Createin2021/1/1115:34*@description:*/publicclassJavaCourseextendsNetworkCourse{@OverridevoidcheckHomework(){System.out.println("检查Java架构的作业");}}大数据课
/***@author:ZhouCong*@date:Createin2021/1/1115:35*@description:*/publicclassBigDataCourseextendsNetworkCourse{/***是否有作业*/privatebooleanneedHomeworkFlag=false;publicBigDataCourse(booleanneedHomeworkFlag){this.needHomeworkFlag=needHomeworkFlag;}@OverridevoidcheckHomework(){System.out.println("检查大数据的课后作业");}@OverrideprotectedbooleanneedHomework(){returnthis.needHomeworkFlag;}}测试
/***@author:ZhouCong*@date:Createin2021/1/1115:40*@description:*/publicclassNetworkCourseTest{publicstaticvoidmain(String[]args){System.out.println("-------Java架构师课程-------");NetworkCoursejavaCourse=newJavaCourse();javaCourse.createCourse();System.out.println("-----大数据课程-----");NetworkCoursebigDataCourse=newBigDataCourse(true);bigDataCourse.createCourse();}}运行结果
附上类结构图
案例:简单实现spring的jdbcTemplate
RowMapper接口:结果集映射
/***功能描述:ORM映射定制化的接口**@Param:*@Return:*@Author:ZhouCong*@Date:2021/1/1115:55*/publicinterfaceRowMapper
/***@author:ZhouCong*@date:Createin2021/1/1116:27*@description:*/publicclassMember{privateStringusername;privateStringpassword;privateStringnickname;privateintage;privateStringaddress;publicStringgetUsername(){returnusername;}publicvoidsetUsername(Stringusername){this.username=username;}publicStringgetPassword(){returnpassword;}publicvoidsetPassword(Stringpassword){this.password=password;}publicStringgetNickname(){returnnickname;}publicvoidsetNickname(Stringnickname){this.nickname=nickname;}publicintgetAge(){returnage;}publicvoidsetAge(intage){this.age=age;}publicStringgetAddress(){returnaddress;}publicvoidsetAddress(Stringaddress){this.address=address;}}MemberDao
/***@author:ZhouCong*@date:Createin2021/1/1116:30*@description:*/publicclassMemberDaoextendsJdbcTemplate{publicMemberDao(DataSourcedataSource){super(dataSource);}publicList<>selectAll(){Stringsql="select*fromt_member";returnsuper.executeQuery(sql,newRowMapper
/***@author:ZhouCong*@date:Createin2021/1/1116:48*@description:*/publicclassMemberDaoTest{publicstaticvoidmain(String[]args){MemberDaomemberDao=newMemberDao(null);List<>result=memberDao.selectAll();System.out.println(result);}}