算法核心思想:父类封装算法逻辑,子类填充具体算法
下面以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; }}