利用Specification模式检索缓存数据
??? 随着缓存技术的引入,网站前台的检索速度大大提高,随之而来的一个问题是检索。通常的经验都是写几个Sql语句,但是现在不同,我们需要从内存中检索数据。如何解决呢?我的方式是使用Specification模式。
??? Specification模式 把 每一个检索条件转化为对象。我们可以对象进行组合,然后对内存数据进行筛选,这样就可以达到目的。
???? 为什么要采用Specification,因为Specification可让开发人员专注于 【检索条件】的使用。
???? 下面给个例子,供大家参考,源代码在附件
??? 1、年龄规约
??? 4、测试类
public class TestMemberSearch { private List<Member> members; @Before public void setUp() { members = new LinkedList<Member>(); members.add(new Member("张三", 1, "15013243543")); members.add(new Member("李四", 2, "13013243743")); members.add(new Member("王武", 3, "18613223243")); members.add(new Member("找刘", 4, "18112243245")); members.add(new Member("李八", 5, "13901243647")); members.add(new Member("星七", 6, "18813223272")); members.add(new Member("孙虎", 7, "139263246243")); members.add(new Member("刘琦", 8, "155213243242")); members.add(new Member("张二天", 9, "150132438755")); members.add(new Member("欧阳一清", 10, "13701323249")); members.add(new Member("尧度", 11, "13913243248")); members.add(new Member("真天", 12, "15213243283")); members.add(new Member("海星", 13, "15713243283")); members.add(new Member("范天", 15, "1361323243")); members.add(new Member("林海", 14, "17013243943")); members.add(new Member("杨波", 16, "15013243243")); members.add(new Member("青檬", 17, "15013243243")); members.add(new Member("赵志", 18, "15013243243")); members.add(new Member("得人", 19, "15013243243")); } @After public void tearDown() { members = null; } @Test public void testFindByAgeWhichIsBetween10And20() { Specification<Member> s1 = new AgeSpecification(10, 20); assertEquals(10, filter(members, s1).size()); } @Test public void testFindByName() { Specification<Member> s1 = new AgeSpecification(10, 20); assertEquals(10, filter(members, s1).size()); } @Test public void testFindByAgeAndName() { Specification<Member> age = new AgeSpecification(10, 20); Specification<Member> name = new NameSpecification("赵"); Specification<Member> findByAgeAndName = age.and(name); assertEquals(1, filter(members, findByAgeAndName).size()); } @Test public void testFindByExpression() { Specification<Member> expressionSpeci = new ExpressionSpecification<Member>(new ExpressionCallback<Member>() { public boolean match(Member obj) { return obj.getName().startsWith("赵"); } }); assertEquals(1, filter(members, expressionSpeci).size()); } private static <T> List<T> filter(Collection<T> list, Specification<T> s) { List<T> lists = new LinkedList<T>(); for (T t : list) { if (s.isSatisfiedBy(t)) { lists.add(t); } } return lists; }}?