zoukankan      html  css  js  c++  java
  • 五、设计模式之策略模式

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

    特点:

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

  • 相关阅读:
    linux定时器【转】
    Linux Timer定时器【转】
    Linux使用一个定时器实现设置任意数量定时器功能【转】
    Ubuntu 12.04将默认集成Landscape管理套件【转】
    【Linux系统编程应用】Linux音频编程基础(一)【转】
    CRT/LCD/VGA Information and Timing【转】
    记录自己对EventLoop和性能问题处理的一点心得【转】
    Linux下select&poll&epoll的实现原理(一)【转】
    MQTT--入门【转】
    RESTful 个人理解总结【转】
  • 原文地址:https://www.cnblogs.com/kancy/p/10230969.html
Copyright © 2011-2022 走看看