五、設計模式之策略模式
阿新 • • 發佈:2019-01-06
策略模式就是提供一組固定演算法的策略,客戶根據自己的需求選擇其中一種策略進行執行。
特點:
- 預先明確的一組固定演算法策略
- 客戶需要選擇其中一種策略
場景:
- 網路爬蟲,針對不同的網站,預先提供不同的解析演算法
- 網站預先提供多種登入策略,使用者可以任選一種登入方式(使用者名稱密碼等,微信登入,QQ登入)
- 訂單支付策略,客戶任選一種支付方式(支付寶,微信支付,銀聯卡支付)
實現方式案例:(實現易擴充套件,遮蔽if_else_if)
程式碼:
定義登入策略:
package com.kancy.pattern.strategy; public interfaceLoginStrategy { 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 implementsLoginStrategy { @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"); } }