设计模式系列–策略模式
定义
策略模式是指定义了算法家族、分别封装起来,让他们之间可以互相替换。此模式让算法的变化不会影响到使用算法的用户。
实现方式
我们平常在使用App登陆账号时,可以使用App本身账号,也可以使用第三方账号如支付宝、微信、微博等进行一键登录。
登陆接口 Login
public interface Login {
String doLogin(String loginWay);
}
支付宝登陆
public class AlipayLogin implements Login {
@Override
public String doLogin(String loginWay) {
return "正在使用支付宝登陆";
}
}
QQ登陆
public class QQLogin implements Login {
@Override
public String doLogin(String loginWay) {
return "正在使用QQ登陆";
}
}
微博登陆
public class SinaWeiboLogin implements Login {
@Override
public String doLogin(String loginWay) {
return "正在使用新浪微博登陆";
}
}
微信登陆
public class WeChatLogin implements Login {
@Override
public String doLogin(String loginWay) {
return "正在使用微信登陆";
}
登陆方式统一管理类 LoginStrategy
public class LoginStrategy {
public static String ALIPAY = "ALIPAY";
public static String QQ = "QQ";
public static String SINAWEIBO = "SINAWEIBO";
public static String WECHAT = "WECHAT";
public static String DEFAULT = WECHAT;
private static Map<String, Login> LOGINMAP = new ConcurrentHashMap<>();
static {
LOGINMAP.put(ALIPAY, new AlipayLogin());
LOGINMAP.put(QQ, new QQLogin());
LOGINMAP.put(SINAWEIBO, new SinaWeiboLogin());
LOGINMAP.put(WECHAT, new WeChatLogin());
}
public Login doLogin(String loginWay) {
Login login = LOGINMAP.get(loginWay);
login = (login == null ? LOGINMAP.get(DEFAULT) : login);
String loginResult = login.doLogin(loginWay);
System.out.println(loginResult);
return login;
}
}
测试 Test
public class Test {
public static void main(String[] args) {
LoginStrategy loginStrategy = new LoginStrategy();
loginStrategy.doLogin(LoginStrategy.ALIPAY);
loginStrategy.doLogin(LoginStrategy.WECHAT);
}
}