1 背景
某天早上,Skr郎正在一边悠哉的吃着加了三跟烤肠的手抓饼,一边悠闲地逛着论坛,看着沙雕网友的帖子,Skr郎会心一笑,正欲给沙雕帖子点赞,邮件忽的弹出,Skr郎慢悠悠的打开邮件
任务: 每日店铺交易表单导出
时限: 一周
要求如下:
1. 表头统一格式为Skr-店铺名称(eg:Skr-SM旗舰店)
2. 内容为店铺当日交易数据
3. 表尾为当天日期
Skr郎心中暗喜,看我两天搞定,剩下的时间就可以嘿嘿嘿了
2 代码出炉
/**
* 交易Service
*
* @author gp6
* @date 2020/3/20
*/
public class TradeService {
/**
* 交易表单导出
*
* @param storeName 店铺名称
*/
public void exportTradeData(String storeName) {
System.out.println("表头:Skr-" + storeName);
System.out.println("交易数据");
System.out.println("表尾:当天日期");
}
}
/**
* 测试模板方法
*
* @author gp6
* @date 2020/3/20
*/
public class TestTemplate {
public static void main(String[] args) {
// 1 : 交易表单导出
TradeService tradeService = new TradeService();
tradeService.exportTradeData("SM旗舰店");
}
}
Skr郎看着完成的代码,心中评价道:这段代码,逻辑严谨,注释清晰,优雅中透露着洒脱,洒脱中透露着不羁,完美!
正洋洋自得间,项目经理喊道:Skr郎,你过来一下!Skr郎赶紧屁颠屁颠的跑过去.
项目经理:临时加个需求,把订单列表 也按照前面一样的格式导出来,时间不加.
Skr郎:好的,没问题(MMP)
/**
* 订单Service
*
* @author gp6
* @date 2020/3/20
*/
public class OrderService {
/**
* 订单表单导出
*
* @param storeName 店铺名称
*/
public void exportOrderData(String storeName) {
System.out.println("表头:Skr-" + storeName);
System.out.println("订单数据");
System.out.println("表尾:当天日期");
}
}
/**
* 测试模板方法
*
* @author gp6
* @date 2020/3/20
*/
public class TestTemplate {
public static void main(String[] args) {
// 1 : 交易表单导出
TradeService tradeService = new TradeService();
tradeService.exportTradeData("SM旗舰店");
// 2 : 订单表单导出
OrderService orderService = new OrderService();
orderService.exportOrderData("SM旗舰店");
}
}
Skr郎看着完成的代码,心中评价道:这段代码,逻辑严谨,注释清晰,优雅中透露着洒脱,洒脱中透露着不羁,虽然没有上一版优雅,但还是比较不错的!
正洋洋自得间,又听项目经理喊道:Skr郎,你过来一下!Skr郎心里想着如果这次加需求不加时间,老子坚决不做!
项目经理:临时在加个需求,把店铺新增粉丝数据 也按照前面一样的格式导出来,时间不加.
Skr郎:好的,没问题(心里问候一下他的族中长辈)
/**
* 粉丝Service
*
* @author gp6
* @date 2020/3/20
*/
public class FansService {
/**
* 新增粉丝表单导出
*
* @param storeName 店铺名称
*/
public void exportAddFansData(String storeName) {
System.out.println("表头:Skr-" + storeName);
System.out.println("新增粉丝数据");
System.out.println("表尾:当天日期");
}
}
/**
* 测试模板方法
*
* @author gp6
* @date 2020/3/20
*/
public class TestTemplate {
public static void main(String[] args) {
// 1 : 交易表单导出
TradeService tradeService = new TradeService();
tradeService.exportTradeData("SM旗舰店");
// 2 : 订单表单导出
OrderService orderService = new OrderService();
orderService.exportOrderData("SM旗舰店");
// 3 : 新增粉丝表单导出
FansService fansService = new FansService();
fansService.exportAddFansData("SM旗舰店");
}
}
Skr郎看着完成的代码,心中评价道:这段代码,逻辑严谨,注释清晰…我呸,这写的什么鬼东西!看着重复的表头与表尾,Skr郎陷入沉思…
如果后面添加有更多的相同格式导出后,要变更表头与表尾的内容格式,是不是每个类中相关的导出方法都要改动,如忘记修改,是不是导出就会格式不统一
格式不统一,问题还是不大的,但是如果重复的不是表头与表尾,而是涉及金钱交易的逻辑,如果有几处忘记修改,是不是就要直接卷铺盖滚蛋??
要将通用的逻辑抽取出来,咦,这不是典型的模板方法模式吗??
3 模板方法模式
定义:
定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤
看了模板方法模式的定义,是不是很符合这种场景
定义一个操作中的算法骨架(表头,获取XX数据,表尾),而将算法的一些步骤(获取XX数据)延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤(获取的数据不同)
简直完美,Skr郎沾沾自喜
/**
* 模板方法的核心(定义一个操作中的算法骨架)
*
* @author gp6
* @date 2020/3/20
*/
public abstract class AbstractTemplate {
/**
* 导出数据
*
* @param storeName 店铺名称
*/
public void exportData(String storeName) {
// 通用逻辑--表头
header(storeName);
// 获取不同的数据
getData();
// 通用逻辑--表尾
end();
}
/**
* 表头
*
* @param storeName 店铺名称
*/
private void header(String storeName) {
System.out.println("表头:Skr-" + storeName);
}
/**
* 表尾
*/
private void end() {
System.out.println("当天日期");
}
/**
* 获取数据(算法的一些步骤(获取XX数据)延迟到子类)
*/
public abstract void getData();
}
/**
* 交易Service
*
* @author gp6
* @date 2020/3/20
*/
public class TradeService extends AbstractTemplate{
/**
* 获取交易数据
*/
@Override
public void getData() {
System.out.println("交易数据");
}
}
/**
* 订单Service
*
* @author gp6
* @date 2020/3/20
*/
public class OrderService extends AbstractTemplate{
/**
* 获取订单数据
*/
@Override
public void getData() {
System.out.println("订单数据");
}
}
/**
* 粉丝Service
*
* @author gp6
* @date 2020/3/20
*/
public class FansService extends AbstractTemplate{
/**
* 获取新增粉丝数据
*/
@Override
public void getData() {
System.out.println("新增粉丝数据");
}
}
/**
* 测试模板方法
*
* @author gp6
* @date 2020/3/20
*/
public class TestTemplate {
public static void main(String[] args) {
// 1 : 交易表单导出
TradeService tradeService = new TradeService();
tradeService.exportData("SM旗舰店");
// 2 : 订单表单导出
OrderService orderService = new OrderService();
orderService.exportData("SM旗舰店");
// 3 : 新增粉丝表单导出
FansService fansService = new FansService();
fansService.exportData("SM旗舰店");
}
}
此时如果要修改表头或表尾内容格式,只需在AbstractTemplate此类中修改即可
Skr郎写到此处,心满意足的点点头,心中评价道:这段代码,逻辑严谨,注释清晰,优雅中透露着洒脱,洒脱中透露着不羁,真是"此码只应天上有,人间难得几回寻!"
呀! 想不到我作诗的功夫也如此深厚,哎,如此完美的男人,别人只能羡慕嫉妒恨!
4 模板方法模式类图
类图中Man/Woman相当于文章中的OrderService/FansService/TradeService
allShop()相当于文章中的exportData()
go()相当于文章中的header()/end()
shop()相当于文章中的exportData()
网友评论