1. 程式人生 > >五、設計模式之策略模式

五、設計模式之策略模式

策略模式就是提供一組固定演算法的策略,客戶根據自己的需求選擇其中一種策略進行執行。

特點:

  1. 預先明確的一組固定演算法策略
  2. 客戶需要選擇其中一種策略

場景:

  1. 網路爬蟲,針對不同的網站,預先提供不同的解析演算法
  2. 網站預先提供多種登入策略,使用者可以任選一種登入方式(使用者名稱密碼等,微信登入,QQ登入)
  3. 訂單支付策略,客戶任選一種支付方式(支付寶,微信支付,銀聯卡支付)

實現方式案例:(實現易擴充套件,遮蔽if_else_if)

LoginStrategy

程式碼:

定義登入策略:

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");
    }
}