《设计模式》之策略模式

策略模式定义

比如对象的某个行为,在不同场景有不同实现方式,可以将这些行为的具体实现定义为一组策略,每个实现类实现种策略,在不同场景使用不同的实现,并且可以自由切换策略。

策略模式结构

策略模式需要一个策略接口,不同的策略实现不同的实现类,在具体业务环境中仅持有该策略接口,根据不同的场景使用不同的实现类即可。
在这里插入图片描述

面向接口编程,而不是面向实现。

优点

1、干掉繁琐的 if、switch 判断逻辑;

2、代码优雅、可复用、可读性好;

3、符合开闭原则(对修改关闭, 对扩展开放),扩展性好、便于维护;

缺点

1、策略如果很多的话,会造成策略类膨胀;

2、使用者必须清楚所有的策略类及其用途;

策略模式代码示例

  • 基础登录接口
//基础登录接口
public interface BaseLoginService {
    void login(BaseLoginContext context);
}
  • 策略上下文实现
@Data
public class BaseLoginContext {
    private String userName;

    private String password;

    private BaseLoginService baseLoginService;

    public BaseLoginContext(String userName, String password, BaseLoginService baseLoginService) {
        this.userName = userName;
        this.password = password;
        this.baseLoginService = baseLoginService;
    }

    public void login(){
        baseLoginService.login(this);
    }
}
  • 定义具体的策略实现类
  1. 实现类1
public class SimpleLoginServiceImpl implements BaseLoginService {
    @Override
    public void login(BaseLoginContext context) {
        System.out.println("简单登录,当前登录的人:" + context.getUserName() + ",密码:" + context.getPassword());
    }
}
  1. 实现类2
public class HardLoginServiceImpl implements BaseLoginService {
    @Override
    public void login(BaseLoginContext context) {
        System.out.println("复杂登录,当前登录的人:" + context.getUserName() + ",密码:" + context.getPassword());
    }
}
  • 调用
public static void main(String[] args) {
        BaseLoginService simple = new SimpleLoginServiceImpl();
        BaseLoginContext simpleContext = new BaseLoginContext("simple","simple",simple);
        simpleContext.login();

        BaseLoginService hard = new HardLoginServiceImpl();
        BaseLoginContext hardContext = new BaseLoginContext("hard","hard",hard);
        hardContext.login();
    }
  • 结果
    在这里插入图片描述

扩展策略

方式1

在策略的算法实现上添加自己需要的数据的方式

public class CommonLoginServiceImpl implements BaseLoginService {

    private String userId;

    public CommonLoginServiceImpl(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    @Override
    public void login(BaseLoginContext context) {
        System.out.println("复杂登录,当前登录的人:" + context.getUserName() + ",账号:" + getUserId() + ",密码:" + context.getPassword());
    }
}
  • 调用
public static void main(String[] args) {
        BaseLoginService simple = new SimpleLoginServiceImpl();
        BaseLoginContext simpleContext = new BaseLoginContext("simple","simple",simple);
        simpleContext.login();

        BaseLoginService hard = new HardLoginServiceImpl();
        BaseLoginContext hardContext = new BaseLoginContext("hard","hard",hard);
        hardContext.login();

        BaseLoginService common = new CommonLoginServiceImpl("001");
        BaseLoginContext commonContext = new BaseLoginContext("common","common",common);
        commonContext.login();
    }
  • 结果
    在这里插入图片描述

方式2

扩展上下文的方式

public class NewLoginContext extends BaseLoginContext{
    private String userId;

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public NewLoginContext(String userName, String password, String userId, BaseLoginService baseLoginService) {
        super(userName, password, baseLoginService);
        this.userId = userId;
    }
}
  • 实现类
public class CommonLoginServiceImpl implements BaseLoginService {

    private String userId;

    public CommonLoginServiceImpl(String userId) {
        this.userId = userId;
    }

    public String getUserId() {
        return userId;
    }

    @Override
    public void login(BaseLoginContext context) {
        NewLoginContext newLoginContext = (NewLoginContext)context;
//        System.out.println("common1登录,当前登录的人:" + context.getUserName() + ",账号:" + getUserId() + ",密码:" + context.getPassword());
        System.out.println("common2登录,当前登录的人:" + context.getUserName() + ",账号:" + newLoginContext.getUserId() + ",密码:" + context.getPassword());
    }
}
  • 调用
public static void main(String[] args) {
        BaseLoginService simple = new SimpleLoginServiceImpl();
        BaseLoginContext simpleContext = new BaseLoginContext("simple","simple",simple);
        simpleContext.login();

        BaseLoginService hard = new HardLoginServiceImpl();
        BaseLoginContext hardContext = new BaseLoginContext("hard","hard",hard);
        hardContext.login();

//        BaseLoginService common1 = new CommonLoginServiceImpl("001");
//        BaseLoginContext commonContext1 = new BaseLoginContext("common","common",common1);
//        commonContext1.login();

        BaseLoginService common2 = new CommonLoginServiceImpl("001");
        NewLoginContext commonContext2 = new NewLoginContext("common","common","002",common2);
        commonContext2.login();
    }
  • 结果
    在这里插入图片描述

相关推荐

  1. 设计模式策略模式

    2024-01-05 12:22:01       32 阅读
  2. 设计模式策略模式

    2024-01-05 12:22:01       33 阅读
  3. 设计模式策略模式

    2024-01-05 12:22:01       20 阅读
  4. 设计模式策略模式

    2024-01-05 12:22:01       15 阅读
  5. 设计模式策略模式

    2024-01-05 12:22:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-05 12:22:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-05 12:22:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-05 12:22:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-05 12:22:01       20 阅读

热门阅读

  1. Vue当中的observable是什么?怎么用

    2024-01-05 12:22:01       31 阅读
  2. UI自动化Selenium 页面窗口window定位切换

    2024-01-05 12:22:01       35 阅读
  3. DevOps(8)

    DevOps(8)

    2024-01-05 12:22:01      37 阅读
  4. 记一次docker中安装redis的过程

    2024-01-05 12:22:01       37 阅读
  5. SVN迁移至GitLab,并附带历史提交记录(二)

    2024-01-05 12:22:01       36 阅读
  6. 【DevOps-07-1】SonarQube介绍与安装

    2024-01-05 12:22:01       41 阅读
  7. Python常用代码大全

    2024-01-05 12:22:01       32 阅读
  8. css制作瀑布流布局

    2024-01-05 12:22:01       48 阅读