写点什么

最常用的设计模式 - 模板方法

用户头像
sdutyq
关注
发布于: 2021 年 03 月 16 日

模板方法, 我们平时经常填写的各种表格就是模板。很多重复的文字不用每次书写,统一的模板打印出来,每个人只需要填写空白部分,比如我们申请银行卡的时候,需要填写如下模板。每个人申请银行卡只需要在 XXX 的地方替换为自己的信息就可以了。

                       信用卡申请表客户姓名:XXX身份证号:XXXXXXXXXXXX本人同意以下授权,实例省略实例省略实例省略实例省略实例省略实例省略实例省略实例省略。                                                          申请人签名:XXXX                                                          申请日期:XXXXX
复制代码


模板方法,就是重用重复的部分模板,每个场景只需要填写变化部分。

编程里使用的模板思想和申请银行卡用的模板是完全一样的,是为了不重复书写重复的代码。填空形式不过从银行卡申请表变成了抽象类,申请表的空白变成了抽象方法。填空的过程替换为子类程序继承父类进行实现抽象方法或 OverWrite。

 

实例:

比如我们互联网架构中,为了提升性能,我们可以使用数据库+缓存提升数据的访问速度。数据库和缓存的数据刷新一致机制代码可以共用的,不仅仅适用于博客文章缓存,也适用于电商的商品展示:

模板部分:

@Slf4jpublic abstract class DataLoader<T> {    public abstract T getObjectFromCache(IdPin idPin);
public abstract T getObjectFromDb(IdPin idPin);
public abstract void setObjectToCache(IdPin idPin, T Object);
public T getObject(IdPin idPin, DataLoaderStrategyEnum dataLoadStrategyEnum) { T object = null; //从cache中取 if (DataLoaderStrategyEnum.CACHE.equals(dataLoadStrategyEnum) || DataLoaderStrategyEnum.CACHE_DB.equals(dataLoadStrategyEnum)) { object = this.getObjectFromCache(idPin); if (null != object) { TrackContext.appendTrackInfo(String.format("redisGet blog from Redis success,id %s", idPin.getId())); return object; } } //从持久化介质取 if (DataLoaderStrategyEnum.CACHE_DB.equals(dataLoadStrategyEnum)) { //从db取,如果取到放进缓存 object = this.getObjectFromDb(idPin); TrackContext.appendTrackInfo(String.format("redisGet blog from db success,id %s", idPin.getId())); //存放Cache if (null != object) { this.setObjectToCache(idPin, object); TrackContext.appendTrackInfo(String.format("redisSet blog to Redis success,id %s", idPin)); } } return object; }}
复制代码


具体填空的子类如下:

DataLoader<CplArticle> dataLoader = new DataLoader<CplArticle>() {        @Override        public CplArticle getObjectFromDb(IdPin idPin) {            return articleRepository.getCplArticleById(idPin);        }
@Override public CplArticle getObjectFromCache(IdPin idPin) { return articleCache.getCplArticleById(idPin.getId()); }
@Override public void setObjectToCache(IdPin idPin, CplArticle cplArticle) { articleCache.cacheCplArticle(idPin.getId(), cplArticle); }};var idPin = IdPin.of(articleId, flyContext.getPin());var cplArticle = dataLoader.getObject(idPin, strategyEnum);
复制代码


发布于: 2021 年 03 月 16 日阅读数: 8
用户头像

sdutyq

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
最常用的设计模式-模板方法