策略模式就是提供一组固定算法的策略,客户根据自己的需求选择其中一种策略进行执行。
特点:
- 预先明确的一组固定算法策略
- 客户需要选择其中一种策略
场景:
- 网络爬虫,针对不同的网站,预先提供不同的解析算法
- 网站预先提供多种登录策略,用户可以任选一种登录方式(用户名密码等,微信登录,QQ登录)
- 订单支付策略,客户任选一种支付方式(支付宝,微信支付,银联卡支付)
实现方式案例:(实现易扩展,屏蔽if_else_if)
代码:
定义登录策略:
package com.kancy.pattern.strategy; public interface LoginStrategy { public void login(); }
package com.kancy.pattern.strategy; public class QQLoginStrategy implements LoginStrategy{ @Override public void login() { System.out.println("用户选择QQ登录方式登录!"); } }
package com.kancy.pattern.strategy; public class WXLoginStrategy implements LoginStrategy { @Override public void login() { System.out.println("用户选择微信登录方式登录!"); } }
package com.kancy.pattern.strategy; public class DefaultLoginStrategy implements LoginStrategy { @Override public void login() { System.out.println("用户选择默认的用户名和密码的形式登录!"); } }
用户登录服务:
package com.kancy.pattern.strategy; public class LoginService { public void login(String loginType){ LoginStrategy loginStrategy = LoginStrategyType.getLoginStrategy(loginType); loginStrategy.login(); } }
注册策略,统一管理
package com.kancy.pattern.strategy; public enum LoginStrategyType { QQ("qq", new QQLoginStrategy()), WX("wx", new WXLoginStrategy()), DEFAULT("default", new DefaultLoginStrategy()); private String loginType; private LoginStrategy loginStrategy; LoginStrategyType (String loginType, LoginStrategy loginStrategy){ this.loginType = loginType; this.loginStrategy = loginStrategy; } /** * 通过标志来获取对应的登录策略,扩展新的登录策略只需要更改策略注册 * @param name * @return */ public static LoginStrategy getLoginStrategy(String name) { LoginStrategyType[] values = values(); for (LoginStrategyType strategy:values ) { if(strategy.getLoginType().equals(name)){ return strategy.getLoginStrategy(); } } return null; } public String getLoginType() { return loginType; } public LoginStrategy getLoginStrategy() { return loginStrategy; } }
用户选择一种策略进行登录:
package com.kancy.pattern.strategy; public class UserLogin { public static void main(String[] args) { LoginService loginService = new LoginService(); loginService.login("qq"); } }