五、设计模式之策略模式

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

特点:

  1. 预先明确的一组固定算法策略
  2. 客户需要选择其中一种策略

场景:

  1. 网络爬虫,针对不同的网站,预先提供不同的解析算法
  2. 网站预先提供多种登录策略,用户可以任选一种登录方式(用户名密码等,微信登录,QQ登录)
  3. 订单支付策略,客户任选一种支付方式(支付宝,微信支付,银联卡支付)

实现方式案例:(实现易扩展,屏蔽if_else_if)

代码:

定义登录策略:

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

原文地址:https://www.cnblogs.com/kancy/p/10230969.html

时间: 2024-10-08 13:00:12

五、设计模式之策略模式的相关文章

设计模式之策略模式20170720

行为型设计模式之策略模式: 一.含义 策略模式是一种比较简单的模式,也叫做政策模式,其定义如下: 定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二.代码说明 1.主要有两个角色 1)Context封装角色 它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化. 2)策略角色 该类含有具体的算法 2.在用C实现过程中也是参考这种思想,以压缩,解压算法举例,具体实现如下: 1)策略模式使用场景

设计模式之策略模式【4】

一.模式定义 它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法变化,不会影响到使用算法的客户. 二.模式分析 1.策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它们可以以相同的方式调用所有算法,减少了各种算法类与是哟算法类之间的耦合. 2.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或者行为.继承有助于析取出这些算法中的公共功能. 3.策略模式就是用来封装算法的,但在实践中,我们发现可以用它来

设计模式:策略模式(Strategy)

定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 策略模式的角色: 1. 抽象策略角色(Strategy):策略类,通常由一个接口或者抽象类实现 2. 具体策略角色(ConcreteStrategy):包装了相关的算法和行为 3. 环境角色(Context):持有一个策略类的引用,最终给客户端调用 这里引用参考资料3中的例子来详细说明一下策略模式. "赔了夫人又折兵"--这个是<三国演义>里的著名桥段,主要是说刘备要去

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

Head First 设计模式之一 策略模式

策略模式 定义 策略模式定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户. 实例 上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子.假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭.绿头鸭等等,鸭子可以划水,可以呱嘎叫.在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类.如下图所示 所有鸭子都会飞.呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.

设计模式之策略模式C++实现

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式UML图如下: 举例: 游泳池中有不同种类的鸭子,有绿头鸭,红头鸭,橡皮鸭,木头鸭等.不同鸭子的特征或行为不同.绿头鸭(MallardDuck)可以叫声是"quack",会飞:橡皮鸭叫声是"queak",不会飞:木头鸭不会叫,也不会飞.利用面向对象原理来设计来泳池中的各种鸭.要求:1.可扩展性好,当有新鸭加入时或鸭的行为有变动时,不用大量改动代码:2.复用性

如何让孩子爱上设计模式 ——14.策略模式(Strategy Pattern)

如何让孩子爱上设计模式 --14.策略模式(Strategy Pattern) 描述性文字 本节讲解的是行为型设计模式中的第一个模式: 策略模式, 这个模式非常简单,也很好理解. 定义一系列的算法,把每个算法封装起来,并使得他们可以相互替换, 让算法独立于使用它的客户而变化. 一般用来替换if-else,个人感觉是面向过程与面向对象思想的 过渡,这里举个简易计算器的栗子,帮助理解~ 普通的if-else/switch计算器 普通的面向过程if-else简易计算器代码如下: 运行结果如下: 这里我