博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板方法模式
阅读量:7075 次
发布时间:2019-06-28

本文共 2793 字,大约阅读时间需要 9 分钟。

hot3.png

算法核心思想:父类封装算法逻辑,子类填充具体算法

下面以sevlet规范来说明一下: 首先抽象一个http的请求对象:

public class HttpRequest {    public String header;    public String body;}public abstract  class HttpSevlet {    public abstract  void doPost(HttpRequest request);    public abstract  void doGet(HttpRequest request);        public void doService(HttpRequest request){        if(request.header.equals("post")){            doPost(request);        }        if(request.header.equals("get")){            doGet(request);        }    }}//各个子类实现自己具体的逻辑:public class LoginServlet extends HttpSevlet {    public void doPost(HttpRequest request) {    }    public void doGet(HttpRequest request) {    }}

与泛型结合使用模板方法

逻辑:设计一个抽象类,把通过interface(http、thrift、dubbo)请求的数据缓存在EhCache中,如果缓存中的数据过期或者被LRU算法淘汰,重新通过interface获取,再次缓存起来.

public abstract class EhcacheBase
{ private static final Log LOG = LogFactory.getLog(EhcacheBase.class); private Cache cache; private long dataVersion=System.currentTimeMillis(); public EhcacheBase(Cache cache) { this.cache=cache; } public abstract T getValueFromInterface(String key); public abstract Map
getBatchValueFromInterface(List
keys); public T getValue(String key){ return getValue(key,true); } public T getValueFromInterfaceAndResetCache(String key){ T newsDetailResult = getValueFromInterface(key); if(null!=newsDetailResult){ try{ cache.put( new Element(key,newsDetailResult) ); dataVersion=System.currentTimeMillis(); }catch(Exception ex){ LOG.error("key="+key,ex); } } return newsDetailResult; } public Map
getBatchValueFromInterfaceAndResetCache(List
keyList){ Map
newsDetailMap = getBatchValueFromInterface(keyList); newsDetailMap.forEach((nid,newsDetail) -> { if(newsDetail != null){ try{ cache.put( new Element(nid,newsDetail) ); dataVersion=System.currentTimeMillis(); }catch(Exception ex){ LOG.error("nid="+nid,ex); } } }); return newsDetailMap; } /** * 父类在此处实现算法逻辑 !!! **/ public T getValue(String key,boolean cacheFirst){ if (null==key) return null; if(cacheFirst){ Element element = cache.get(key); if( null!=element && null!=element.getObjectValue() ) return (T)element.getObjectValue(); else{ return getValueFromInterfaceAndResetCache(key); } }else{ return getValueFromInterfaceAndResetCache(key); } } public T getValueFromCache(String key) { if (null==key) { return null; } Element element=cache.get(key); if(null != element && null != element.getObjectValue()) return (T) element.getObjectValue(); else{ return null; } } public long getDataVersion() { return dataVersion; }}

 

转载于:https://my.oschina.net/u/4129361/blog/3049558

你可能感兴趣的文章