定西谁做网站,帮人建网站价格赚钱吗,网站建设维护管理办法,新乡网站设计公司设计一个缓存--针对各种类型的缓存 1. 设计顶层接口2. 设计抽象类 -- AbstractCacheManager3. 具体子类3.1 -- AlertRuleItemExpCacheManager3.2 -- AlertRuleItemSrcCacheManager 4. 类图关系 1. 设计顶层接口
// 定义为一个泛型接口,提供给抽象类使用
public interface Cach… 设计一个缓存--针对各种类型的缓存 1. 设计顶层接口2. 设计抽象类 -- AbstractCacheManager3. 具体子类3.1 -- AlertRuleItemExpCacheManager3.2 -- AlertRuleItemSrcCacheManager 4. 类图关系 1. 设计顶层接口
// 定义为一个泛型接口,提供给抽象类使用
public interface CacheManagerT {// 获取所有的缓存itemListT getAll();// 根据条件获取某些缓存itemListT get(PredicateT predicate);// 设置缓存boolean set(T t);// 设置缓存listboolean set(ListT tList);
}有接口必定有实现类或者抽象类实现接口。 那为了更好地控制子类的行为可以做一个抽象类控制子类行为。 分析 抽象类作为缓存管理的话那么就需要提供安全访问数据需要考虑线程安全问题。花絮 不仅要满足上述需求而且让代码尽量简洁。
2. 设计抽象类 – AbstractCacheManager
属性设计 需要一个缓存需要一个线程安全机制方案 行为设计 自己的行为 利用线程安全机制控制缓存的读写。权限仅自己可访问 后代的行为 访问一些简单api方法即可实现安全访问缓存权限公共访问 设计模式 包裹思想将后代行为方法中包裹一层安全访问的行为。
Java Code // properties design:
protected ConcurrentMapString, T cache;private ReentrantReadWriteLock lock new ReentrantReadWriteLock();// subclass to implements these abstract methods.protected abstract ListT getAllByCache();protected abstract void setByCache(T t);protected abstract void setByCache(ListT tList);protected abstract ListT getByCache(PredicateT predicate);// next content needs to consider safety of multithreads. following methods do implements.
// entry to use
Override
public final ListT getAll() {return this.readLockThenGet(() - this.getAllByCache());
}Override
public final ListT get(PredicateT predicate) {return this.readLockThenGet(pre - getByCache(pre), predicate);
}Override
public final boolean set(T t) {return this.writeLockThenSet((ConsumerT) obj - set(obj), t);
}Override
public final boolean set(ListT tList) {return this.writeLockThenSet((ConsumerListT) list - set(list), tList);
}// current abstract class access cache object.
private boolean writeLockThenSet(Consumer consumer, Object object){boolean wLock false;try {if (!(wLock lock.writeLock().tryLock(100, TimeUnit.MICROSECONDS))) {return false;}consumer.accept(object);return true;} catch (Exception e) {return false;} finally {if(wLock) {lock.writeLock().unlock();}}
}private ListT readLockThenGet(SupplierListT supplier){boolean rLock false;try{if(!(rLock lock.readLock().tryLock(100, TimeUnit.MICROSECONDS))){return null;}return supplier.get();}catch (Exception e){return null;}finally {if(rLock) {lock.readLock().unlock();}}
}private ListT readLockThenGet(FunctionPredicateT, ListT function, PredicateT predicate){boolean rLock false;try{if(!(rLock lock.readLock().tryLock(100, TimeUnit.MICROSECONDS))){return null;}return function.apply(predicate);}catch (Exception e){return null;}finally {if(rLock) {lock.readLock().unlock();}}
}3. 具体子类
3.1 – AlertRuleItemExpCacheManager
Component(alertRuleItemExpCacheManager)
public class AlertRuleItemExpCacheManagerT extends AlertRuleItemExpCache extends AbstractCacheManagerAlertRuleItemExpCache {Resourceprivate AlertRuleItemExpDao alertRuleItemExpDao;Overrideprotected ListAlertRuleItemExpCache getAllByCache() {if (null cache) {ListAlertRuleItemExp alertRuleItemSrcList alertRuleItemExpDao.selectList(Wrappers.AlertRuleItemExplambdaQuery().eq(AlertRuleItemExp::getDeleted, 0));cache alertRuleItemSrcList.stream().map(entity - entity.toCache()).collect(Collectors.toConcurrentMap(cache - cache.getId().toString(), cache - cache));}return cache.values().stream().sorted(Comparator.comparing(AlertRuleItemExpCache::getId)).collect(Collectors.toList());}Overrideprotected void setByCache(AlertRuleItemExpCache alertRuleItemExpCache) {cache.put(alertRuleItemExpCache.getId().toString(), alertRuleItemExpCache);}Overrideprotected void setByCache(ListAlertRuleItemExpCache alertRuleItemExpCacheList) {alertRuleItemExpCacheList.parallelStream().forEach(alertRuleItemExpCache -cache.put(alertRuleItemExpCache.getId().toString(), alertRuleItemExpCache));}Overrideprotected ListAlertRuleItemExpCache getByCache(PredicateAlertRuleItemExpCache predicate) {return getAllByCache().stream().filter(cache - predicate.test(cache)).collect(Collectors.toList());}
}3.2 – AlertRuleItemSrcCacheManager
Component(alertRuleItemSrcCacheManager)
public class AlertRuleItemSrcCacheManagerT extends AlertRuleItemSrcCache extends AbstractCacheManagerAlertRuleItemSrcCache {Resourceprivate AlertRuleItemSrcDao alertRuleItemSrcDao;Overrideprotected ListAlertRuleItemSrcCache getAllByCache() {if (null cache) {ListAlertRuleItemSrc alertRuleItemSrcList alertRuleItemSrcDao.selectList(Wrappers.AlertRuleItemSrclambdaQuery().eq(AlertRuleItemSrc::getDeleted, 0));cache alertRuleItemSrcList.stream().map(entity - entity.toCache()).collect(Collectors.toConcurrentMap(cache - cache.getId().toString(), cache - cache));}return cache.values().stream().sorted(Comparator.comparing(AlertRuleItemSrcCache::getId)).collect(Collectors.toList());}Overrideprotected void setByCache(AlertRuleItemSrcCache alertRuleItemSrcCache) {cache.put(alertRuleItemSrcCache.getId().toString(), alertRuleItemSrcCache);}Overrideprotected void setByCache(ListAlertRuleItemSrcCache alertRuleItemSrcCacheList) {alertRuleItemSrcCacheList.parallelStream().forEach(alertRuleItemSrcCache -cache.put(alertRuleItemSrcCache.getId().toString(), alertRuleItemSrcCache));}Overrideprotected ListAlertRuleItemSrcCache getByCache(PredicateAlertRuleItemSrcCache predicate) {return getAllByCache().stream().filter(cache - predicate.test(cache)).collect(Collectors.toList());}
}4. 类图关系