Java设计模式之策略模式(Strategy)

前言:

最近一直在学习基于okHttp网络请求,学习的过程中就想起了之前项目中有这么一个需求不同的接口要采用不同的加密方式,比如登录之前要采用RSA加密,登录之后要采用AES加密,当时是采用靠传递一个参数过去来对参数进行不同的加密算法,这样会让代码难以维护而且难以扩展,那该如何解决呢?今天来学习一下策略模式Strategy!用它来解决这个问题。

策略模式:

       策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。

举例说明如何使用策略模式:

还是以之前项目中的为不同的请求采用不同的加密方式为例说明。

1.)未采用策略模式的实现方式

    enum EncryptType{AES,RSA};
    public void doRequest(EncryptType  type ,String params){
        switch (type){
            case AES:
                // 此处进行AES加密算法
                params="经过AES加密过数据";
                break;
            case RSA:
                // 此处进行RSA加密算法
                params="经过RSA加密过数据";
                break;
        }
       //然后调用网络请求将参数发送过去
    }

上面的代码可以看出如果要继续增加其他方式的加密算法的时候,只有通过增加EncryptType枚举类型,然后增加类型判断,不仅破坏了网络请求结构,也导致了耦合性很高不利于扩展。

2.)使用策略模式第一步:声明加密接口

public interface IEncryptStrategy {

    String encryptStr(String params);
}

3.)使用策略模式第二步:添加不同的策略

RSA方式

public class RSAStrategy implements IEncryptStrategy {
    @Override
    public String encryptStr(String params) {
        return "经过RSA加密过数据";
    }
}

AES方式

public class AESStrategy implements IEncryptStrategy {
    @Override
    public String encryptStr(String params) {
        return "经过AES加密过的数据";
    }
}

3.)使用策略模式第三步:选择不同的策略

使用策略

        IEncryptStrategy rsaStrategy=new RSAStrategy();
        doRequest(rsaStrategy,"test");

接收策略

    public void doRequest(IEncryptStrategy encryptStrategy , String params){
        params=encryptStrategy.encryptStr(params);
       //然后调用网络请求将参数发送过去
    }

通过上面的例子我们总结一下策略模式的优缺点:

优点:

1、 简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。 
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展。 
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合。

缺点: 
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量。

2、 在基本的策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象,没有解除客户端需要选择判断的压力

总结:

通过使用策略模式很好的解决了之前项目中遇到的请求加密需求,而且做到了更加容易的扩展性。

时间: 2025-01-02 16:07:19

Java设计模式之策略模式(Strategy)的相关文章

JAVA设计模式之策略模式 - Strategy

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 介绍 什么是策略模式(Strategy Pattern) 在软件开发过程中常常遇到这样的情况, 实现某一个功能有很多种算法或实现策略, 我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能. 如果将这些算法或者策略抽象

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

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

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

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

二十四种设计模式:策略模式(Strategy Pattern)

策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有Insert()和Get()方法,持久化数据在SqlServer数据库中或Xml文件里(两种可互换的算法).由客户端决定使用哪种算法. MessageModel using System; using System.Collections.Generic; using System.Text; na

Java设计模式1——策略模式(Strategy Pattern)

最近觅得一本好书<您的设计模式>,读完两章后就能断言,一定是一头极品屌丝写的,而且是专写给开发屌丝男的智慧枕边书,小女子就委屈一下,勉强看看,人笨,谁让他写得这么通俗易懂呢!为了加深理解,用自己的方式记录下来. 上第一章的策略模式之前讲个故事,解释一下类设计的背景:刘备要去江东娶老婆,临走时诸葛亮给伴郎赵云三个锦囊妙计,嘱咐按天机拆开解决棘手问题.这才有了后来的周瑜赔了夫人又折兵.三个妙计放在锦囊中,赵云从锦囊中取妙计获胜.先看类图: 1.三个妙计是具体的实现类,我们设计一个接口,再写三个实现

Java 设计模式之 策略模式

思维导图: 我们先来看 STRATEGY 设计模式的通俗解释: 跟不同类型的MM约会,要用不同的策略,有的请电影比较好,有的则去吃小吃效果不错,有的去海边浪漫最合适,但目的都是为了得到 MM 的芳心,我的追 MM 锦囊中有好多 Strategy 哦.策略模式: 策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换. 策略模式使得算法可以在不影响到客户端的情况下发生变化.策略模式把行为和环境分开.环境类负责维持和查询行为类,各种算法在具体的策略类中提供.由于算

折腾Java设计模式之策略模式

博客原文地址 简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换. 主要解决 在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用 一个系统有许多许多类,而区分它们的只是他们直接的行为. 如何解决 将这些算法封装成一个一个的类,任意地替换. 主要角色 上下文C

java设计模式之——策略模式

1.策略模式有什么好处? 策略模式的好处在于你可以动态的改变对象的行为. 2.设计原则 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++中可以用虚类),然后在类中包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为.下面是一个例子. 策略模式属于对象行为型模式,主要针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换.策略模式使得算法可以在不影响 到客户端的情况下发生变化.通常,策略模式适用于当一个应用程序需

JAVA中的策略模式strategy

原文出自:http://ttitfly.iteye.com/blog/136467 1. 以一个算术运算为例,传统做法为: java 代码 package org.common; public class Calculate { public String getResult(float a,float b,char c){ float add = a+b; float sub = a-b; float mult = a*b; float division = a/b; switch(c){ c