五、设计模式之策略模式

策略模式就是提供一组固定算法的策略,客户根据自己的需求选择其中一种策略进行执行。

特点:

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

猜你喜欢

转载自www.cnblogs.com/kancy/p/10230969.html