if-else太丑?策略模式则是杀鸡用牛刀?Map+函数式接口方法刚刚好!

场景

假设有一个发照片到社交平台的场景

    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语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,仅修改一个具体的实现类的逻辑即可,可维护性会好不少。

以下是策略模式的具体结构

if-else太丑?策略模式则是杀鸡用牛刀?Map+函数式接口方法刚刚好!_第1张图片

 

    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> 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 function = grantTypeMap.get(where);
        if(function!=null){
            System.out.println(function.apply(photo));
            return;
        }
        System.out.println("没有这款App");
    }

    @Test
    public void test(){
        send("微信","全家福");
    }
}

你可能感兴趣的:(常用,学习日记,策略模式,开发语言)