• 五、设计模式之策略模式


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

    特点:

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

  • 相关阅读:
    HTML&CSS 学习网站收藏【转】
    HTML5安全:CORS(跨域资源共享)简介【转】
    SPDY以及示例
    前端开发中,对图片的优化技巧有哪些?(比如淘宝首页的图片)
    【javascript基础】之【__lookupSetter__ 跟 __lookupSetter__】
    毫秒必争,前端网页性能最佳实践【转】
    最近遇到的兼容性问题和适配问题
    备份的一些小tip
    Http2改造实践:statusText丢失问题
    vue-cli脚手架npm相关文件解读(9)config/index.js
  • 原文地址:https://www.cnblogs.com/kancy/p/10230969.html
Copyright © 2020-2023  润新知