美文网首页
策略模式:【利于扩展,消除if的模式】

策略模式:【利于扩展,消除if的模式】

作者: 分布式与微服务 | 来源:发表于2022-10-23 09:06 被阅读0次

1.前言

对于大多数多种类型的逻辑代码,我们一般的做法一般是通过if来进行判断,然后再{}里进行逻辑代码的编写,如下述

package org.example.designpattern.strategy;

public class LoginNoDesign {

    /**
     * 登录方法, 不使用策略模式时, 对于流程的扩展如新增一种登录方式只能添加if
     *
     * @param username 用户名
     * @param password 密码
     * @param type     登录方式
     */
    public void login(String username, String password, String type) {
        if ("mobile".equals(type)) {
            // 手机号登录
            System.out.println("手机号登录成功");
        } else {
            // 用户名密码登录
            System.out.println("用户名密码登录成功");
        }
    }
}

但这种代码给整个方法增添了一种臃肿,往往一个方法需要大几十甚至上百行代码。

二.策略模式介绍

策略模式是行为模式的一种,也是消除if的重要手段,通过对于同类逻辑的不同策略来实现替代,如我们有多种登陆方式,那么可以先定义某种type对应某种策略,在使用时通过type来获取对应执行策略。

三.代码实现

package org.example.designpattern.strategy;

public interface ILogin {

    /**
     * 登录方法
     *
     * @param username 用户名
     * @param password 密码
     * @param type     登录方式
     */
    void login(String username, String password, String type);
}

package org.example.designpattern.strategy;

public class MobileLogin implements ILogin{

    @Override
    public void login(String username, String password, String type) {
        System.out.println("手机号登录成功");
    }
}

package org.example.designpattern.strategy;

public class UsernameLogin implements ILogin{

    @Override
    public void login(String username, String password, String type) {
        System.out.println("用户名密码登录成功");
    }
}

测试

package org.example.designpattern.strategy;

import org.junit.Test;

public class StrategyTests {

    @Test
    public void test() {
        LoginNoDesign loginNoDesign = new LoginNoDesign();
        loginNoDesign.login("root", "root", "username");

        // 策略模式
        ILogin login = new MobileLogin();
        login.login("13903291525", "", "mobile");
    }
}

对比

通过类型将各自实现分开,这样将原来的耦合的代码分开,在某种类型逻辑需要修改维护时也不需要测试其他已经跑通的逻辑。

扩展

结合工厂模式,预定义对应类型所执行的策略

package org.example.designpattern.strategy;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class LoginServiceFactory {

    private static Map<String, ILogin> loginMap = new ConcurrentHashMap<>();

    static {
        loginMap.put("mobile", new MobileLogin());
        loginMap.put("username", new UsernameLogin());
    }

    public static ILogin getLoginService(String type) {
        return loginMap.get(type);
    }
}

测试

package org.example.designpattern.strategy;

import org.junit.Test;

public class StrategyTests {

    @Test
    public void test() {
        LoginNoDesign loginNoDesign = new LoginNoDesign();
        loginNoDesign.login("root", "root", "username");

        // 策略模式
        ILogin login = new MobileLogin();
        login.login("13903291525", "");

        // 结合工厂
        ILogin login1 = LoginServiceFactory.getLoginService("mobile");
        login1.login("13903291525", "");
    }
}

四.总结

策略模式并不复杂,通过策略模式可以优化掉代码中的大量if,可以极大的提高系统的扩展性

相关文章

  • 策略模式:【利于扩展,消除if的模式】

    1.前言 对于大多数多种类型的逻辑代码,我们一般的做法一般是通过if来进行判断,然后再{}里进行逻辑代码的编写,如...

  • js常用设计模式总结

    策略模式:优点:减少不必要的判断,代码解偶,扩展性良好缺点:策略类增多,对外暴露 代理模式:优点:职责清晰、高扩展...

  • Dubbo入门学习--集群容错模式​(5)

    Dubbo入门学习--集群容错模式 集群容错模式: 可以自行扩展集群容错策略 Available Cluster ...

  • 策略模式

    类方式实现策略模式 根据不同情况动态选择不同的实例方法 命名元祖实现策略模式 attrgetter有利于函数式编程...

  • 【设计模式】之策略模式

    策略模式 策略模式属于行为模式,可以在运行时不修改类本身而通过变更内部算法来处理类的行为变更。这允许对象的可扩展性...

  • 11.7设计模式-策略模式-详解

    设计模式-策略模式 策略模式详解 策略模式在android中的实际运用 1.策略模式详解 2.策略模式在andro...

  • PHP设计模式-策略模式

    策略模式 用途 分离「策略」并使他们之间能互相快速切换。此外,这种模式是一种不错的继承替代方案(替代使用扩展抽象类...

  • [Python设计模式] 02 - 策略模式

    设计模式的目的是让代码易维护、易扩展,不能为了模式而模式,因此一个简单的工具脚本是不需要用到任何模式的。 策略模式...

  • Dubbo filter扩展

    filter其实是一种责任链模式,每个filter只负责完成自己职责的部分,解除耦合,这种设计模式很利于扩展。大家...

  • 深入浅出设计模式(一)-策略模式

    本文解决问题 什么是策略模式? 策略模式的优缺点以及策略模式解决了什么痛点 策略模式的适用环境 什么是策略模式? ...

网友评论

      本文标题:策略模式:【利于扩展,消除if的模式】

      本文链接:https://www.haomeiwen.com/subject/lxgowrtx.html