意图:将一系列的算法分别封装起来,可以随意的去调用。
主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。(当然,如果封装的算法只是很简单的操作,那不如if...else来的方便)
何时使用:如果if...else中需要写很多东西,而它们只是执行行为(就是里面的各种蛇皮操作)不一样。但是方法调用流程一样,这里就可以封装起来。
关键代码:一个算法执行对象的构造函数,一系列算法共有的接口。
UML图大概就这个意思(图片来自菜鸟教程策略模式):
算法共有的接口:
//算法共有的接口
public interface Cache {
void set(String key,String val);
String get(String key);
}
具体的算法实现(省略一万行代码)此处加上数据库的具体实现,就是做缓存时常用的存取缓存的方法了:
public class CacheContext {
private Cache cache;
public CacheContext(Cache cache){
this.cache = cache;
}
public void put(String key,String value){
cache.set(key,value);
}
public String get(String key){
return cache.get(key);
}
}
public class RedisCache implements Cache {
@Override
public void set(String key, String val) {
System.out.println("存入的redis key"+key+"存入的val"+val);
}
@Override
public String get(String key) {
return "由key"+key+"取到的值"+"这里写个固定值!RedisCache =_=";
}
}
public class Encache implements Cache {
@Override
public void set(String key, String val) {
System.out.println("存入的encache key"+key+"存入的val"+val);
}
@Override
public String get(String key) {
return "由key"+key+"取到的值"+"这里写个固定值!EnCache =_=";
}
}
public class MemCache implements Cache {
@Override
public void set(String key, String val) {
System.out.println("存入的memcahe key"+key+"存入的val"+val);
}
@Override
public String get(String key) {
return "由key"+key+"取到的值"+"这里写个固定值!MemCache =_=";
}
}
统一调用方法的地方,主要还是利用了多态
public class CacheContext {
private Cache cache;
public CacheContext(Cache cache){
this.cache = cache;
}
public void put(String key,String value){
cache.set(key,value);
}
public String get(String key){
return cache.get(key);
}
}
最后是具体调用者去使用
public class DoIt {
public static void main(String[] args) {
CacheContext context = new CacheContext(new RedisCache());
context.put("11","22");
System.out.println(context.get("11"));
CacheContext context1 = new CacheContext(new MemCache());
context1.put("11","22");
System.out.println(context1.get("11"));
CacheContext context2 = new CacheContext(new Encache());
context2.put("11","22");
System.out.println(context2.get("11"));
}
}
打印日志:
存入的redis key11存入的val22
由key11取到的值这里写个固定值!RedisCache =_=
存入的memcahe key11存入的val22
由key11取到的值这里写个固定值!MemCache =_=
存入的encache key11存入的val22
由key11取到的值这里写个固定值!EnCache =_=