策略模式
策略模式的应用场景
最近公司项目,我搭建了一个缓存服务器的项目,功能模块构建到最后有一个问题纠结了我很久。首先我先介绍一下我自己的这个缓存工程的功能的一个实现思路。我们项目的架构是从一台Oracle服务器中获取需要缓存的数据(经常查询的),然后放入redis缓存服务器中。
实现过程:
1.从oracle服务器中获取需要缓存的数据,大概有十几张表的数据,这个功能模块我是封装了一个观察者模式,其中的被观察者执行的是从oracle Server中获取数据的功能。
2.获取的数据暂时存放在一些单例容器中,每张表各一个单例容器,互不影响
3.观察者实例和被观察者实例都是存放在工厂中,被观察者查询oracle服务器获取数据触发观察者把数据从单例容器中获取出来。
4.如果有十张表的数据需要缓存,那么就有十个观察者的实例。那么就需要十个策略对象来帮助这些观察者来完成数据的缓存。其实这里用if else 完全可以代替观察者,此外还能节省对象内存的开销,
但是为了代码的一个健壮性,我情愿牺牲一些内存和代码的构建时间来完成这样的一个功能,因为这样可以完全把数据的缓存交给策略对象去完成,而观察者不需要承担太多的角色,只是完成从
oracleServer中数据的获取和存放即可。这也是我近来养成的一个习惯,再者说,缓存服务器只是为了数据的一个缓存功能,代码构建复杂一些或者对象的控制稍微松一些并不影响业务系统的性能。
5.最后遍历观察者集合,根据不同的观察者调用相应策略对象去完成数据的缓存服务。
具体的实现过程是如此,下面我就用一个简单的例子来完成一个策略模式的应用:
1 package com.sunyard.strategy; 2 3 import java.util.List; 4 import java.util.Map; 5 6 /** 7 * 抽象策略模式 8 * @author:jiw.yu@sunyard.com 9 * @date:2017-7-1 10 */ 11 public interface Strategy { 12 13 /** 14 * 插入redis 15 * @param list 16 */ 17 public void doSaveToRedis(List<Map<String, String>> list); 18 19 }
1 package com.sunyard.strategy; 2 3 import java.util.List; 4 import java.util.Map; 5 6 /** 7 * 策略context 8 * @author:jiw.yu@sunyard.com 9 * @date:2017-7-1 10 */ 11 public class StrategyContext { 12 private Strategy strategy; 13 14 public StrategyContext(Strategy strategy){ 15 this.strategy = strategy; 16 } 17 18 /** 19 * 保存至redis服务器 20 * @param list hash数据的线性表 21 */ 22 public void doSaveDateToRedisServer(List<Map<String, String>> list){ 23 strategy.doSaveToRedis(list); 24 } 25 }
1 package com.sunyard.strategy; 2 3 import java.util.List; 4 import java.util.Map; 5 6 public class ADataStrategy implements Strategy{ 7 8 @Override 9 public void doSaveToRedis(List<Map<String, String>> list) { 10 System.out.println("将A数据保存至redis服务器"); 11 } 12 }
1 package com.sunyard.strategy; 2 3 import java.util.List; 4 import java.util.Map; 5 6 public class BDataStrategy implements Strategy{ 7 @Override 8 public void doSaveToRedis(List<Map<String, String>> list) { 9 System.out.println("将B数据保存至redis服务器"); 10 } 11 }
1 package com.sunyard.strategy; 2 3 import java.util.List; 4 import java.util.Map; 5 6 public class CDataStrategy implements Strategy{ 7 @Override 8 public void doSaveToRedis(List<Map<String, String>> list) { 9 System.out.println("将C数据保存至redis服务器"); 10 } 11 }
1 package com.sunyard.test; 2 3 import com.sunyard.strategy.ADataStrategy; 4 import com.sunyard.strategy.BDataStrategy; 5 import com.sunyard.strategy.CDataStrategy; 6 import com.sunyard.strategy.StrategyContext; 7 8 public class Test { 9 public static void main(String[] args) { 10 StrategyContext context = new StrategyContext(new ADataStrategy()); 11 context.doSaveDateToRedisServer(null); 12 13 context = new StrategyContext(new BDataStrategy()); 14 context.doSaveDateToRedisServer(null); 15 16 context = new StrategyContext(new CDataStrategy()); 17 context.doSaveDateToRedisServer(null); 18 } 19 }
输出结果:
1 将A数据保存至redis服务器 2 将B数据保存至redis服务器 3 将C数据保存至redis服务器