策略模式属于行为型模式的一种,将一系列的算法进行封装,把它们一个一个的进行封装,用到那个算法使用那个算法。将算法的使用和算法的实现进行隔离开。
角色划分
抽象策略:抽象角色,定义出所有的具体策略类所需要的接口
具体策略:提供算法的具体行为
环境:这个里面放策略类的引用,最终给客户端使用
使用场景
例如多渠道登录、客服多渠道接入等等
案例:现在企业要开发一款软件,其中的登录功能需要支持微信登录,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();
}
}
策略模式优缺点
好处
- 算法之间的解耦合。
- 新策略算法和系统集成更加方便,因为每一个策略都是相互独立出来的
坏处
- 算法策略过多,会导致类的数量变多