场景
假设有一个发照片到社交平台的场景
public void sendQq(String photo){
System.out.println("把照片" + photo + "发到了QQ");
}
public void sendWeChat(String photo){
System.out.println("把照片" + photo + "发到了微信");
}
public void sendWeiBo(String photo){
System.out.println("把照片" + photo + "发到了微博");
}
public void sendTikTok(String photo){
System.out.println("把照片" + photo + "发到了抖音");
}
if-else或者switch case
第一个能想到的思路就是if-else或者switch case:
public void send(String where,String photo){
switch(where){
case "QQ":
sendQq(photo);
break;
case "微信":
sendWeChat(photo);
break;
case "微博" :
sendWeiBo(photo);
break;
case "抖音" :
sendTikTok(photo);
break;
}
}
如果要这么写的话, 一个方法的代码可就太长了,影响了可读性。
而且由于 整个 if-else的代码有很多行,也不方便修改,可维护性低。
重点是一点都不装杯((#^.^#))
策略模式
策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,仅修改一个具体的实现类的逻辑即可,可维护性会好不少。
策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,仅修改一个具体的实现类的逻辑即可,可维护性会好不少。
以下是策略模式的具体结构
public void send(String where,String photo){
switch(where){
case "QQ":
new Context(new QQ()).handle(photo);
break;
case "微信":
new Context(new WeChat()).handle(photo);
break;
case "微博" :
new Context(new WeiBo()).handle(photo);
break;
case "抖音" :
new Context(new TikTok()).handle(photo);
break;
}
}
但缺点也明显:
-
如果 if-else的判断情况很多,那么对应的具体策略实现类也会很多,上边的具体的策略实现类还只是四个,如果其实函数逻辑并不是很复杂的逻辑的话,确实杀鸡用牛刀了
-
没法俯视整个分派的业务逻辑
Map+函数式接口
用上了Java8的新特性lambda表达式
-
判断条件放在key中
-
对应的业务逻辑放在value中
这样子写的好处是非常直观,能直接看到判断条件对应的业务逻辑
public class SendPicture {
private static Map<String, Function<String,String>> grantTypeMap=new HashMap<>();
public static String sendQq(String photo){
return "把照片" + photo + "发到了QQ";
}
public static String sendWeChat(String photo){
return "把照片" + photo + "发到了微信";
}
public static String sendWeiBo(String photo){
return"把照片" + photo + "发到了微博";
}
public static String sendTikTok(String photo){
return"把照片" + photo + "发到了抖音";
}
static {
grantTypeMap.put("QQ",photo->SendPicture.sendQq(photo));
grantTypeMap.put("微信",photo->SendPicture.sendWeChat(photo));
grantTypeMap.put("微博",photo->SendPicture.sendWeiBo(photo));
grantTypeMap.put("抖音",photo->SendPicture.sendTikTok(photo));
}
public void send(String where,String photo){
Function<String, String> function = grantTypeMap.get(where);
if(function!=null){
System.out.println(function.apply(photo));
return;
}
System.out.println("没有这款App");
}
@Test
public void test(){
send("微信","全家福");
}
}