设计模式-策略模式

45 阅读2分钟

策略模式属于行为型模式的一种,将一系列的算法进行封装,把它们一个一个的进行封装,用到那个算法使用那个算法。将算法的使用和算法的实现进行隔离开。

角色划分

抽象策略:抽象角色,定义出所有的具体策略类所需要的接口

具体策略:提供算法的具体行为

环境:这个里面放策略类的引用,最终给客户端使用

使用场景

例如多渠道登录、客服多渠道接入等等

案例:现在企业要开发一款软件,其中的登录功能需要支持微信登录,qq登录、支付宝登录和手机号登录这个场景就是一个典型的策略

UML

案例实现

1、抽象策略

public interface LoginOutStartegy {
    //登录
    void login();
    //登出
    void out();
}

2、具体策略类

阿里登录

public class AliPayStartegy implements LoginOutStartegy{
    @Override
    public void login() {
        System.out.println("使用支付宝登录,xxx平台");
    }
    @Override
    public void out() {
        System.out.println("支付宝退出xxx平台");
    }
}

手机号登录

public class PhoneStartegy implements LoginOutStartegy{
    @Override
    public void login() {
        System.out.println("使用手机号登录,xxx平台");
    }
    @Override
    public void out() {
        System.out.println("手机号退出xxx平台");
    }
}

QQ登录

public class QqStartegy implements LoginOutStartegy{
    @Override
    public void login() {
        System.out.println("使用QQ登录,xxx平台");
    }
    @Override
    public void out() {
        System.out.println("QQ退出xxx平台");
    }
}

微信登录

public class WechatStartegy implements LoginOutStartegy{
    @Override
    public void login() {
        System.out.println("使用微信登录,xxx平台");
    }
    @Override
    public void out() {
        System.out.println("微信退出xxx平台");
    }
}

3、环境类

public class Context {
    LoginOutStartegy loginOutStartegy;
    public void  executeStartegy(){	
        loginOutStartegy.login();
        loginOutStartegy.out();
    }
    public Context() {
    }
    public Context(LoginOutStartegy loginOutStartegy) {
        this.loginOutStartegy = loginOutStartegy;
    }
    public void setLoginOutStartegy(LoginOutStartegy loginOutStartegy) {
        this.loginOutStartegy = loginOutStartegy;
    }
}

4、客户端类

public class ClientStartegy {
    public static void main(String[] args) {
        Context context = new Context();
        AliPayStartegy aliPayStartegy = new AliPayStartegy();
        context.setLoginOutStartegy(aliPayStartegy);
        context.executeStartegy();
    }
}

策略模式优缺点

好处

  • 算法之间的解耦合。
  • 新策略算法和系统集成更加方便,因为每一个策略都是相互独立出来的

坏处

  • 算法策略过多,会导致类的数量变多