设计模式之-策略模式(strategypattern)

韧雪飞舞 韧雪飞舞     2022-08-30     646

关键词:

引入:项目中涉及到工作流,当然这个工作流的实现是由用户根据不同的策略或者说方式传入处理这个事件的人的审批链,后台在存储过程中进行解析,然后生成最终的审批链,在系统中流转进行审批。 比如审批链: 张三 -> 李四 -> 王五

由于很多外部系统接入,所以系统提供多种审批链的生成方式供外部系统选择,比如 1. 已经定好的好审批链的(叫做模板)传入模板 ID 系统就可以根据传入的模板生成审批链; 2. 外部系统自定义审批链,则 外部系统直接传入审批  链,张三 -> 李四 -> 王五 ,我们系统进行解析存储。

最近坐在旁边的一哥们做这一块,于是乎这几天耳边总是“策略”二字。因为当时不了解策略模式,觉得很有趣,那么多处理方式如何能调用到目标类进行处理,所以昨晚1点多睡不着,决定来学习下这个设计模式- 策略模式。 

书中定义: 定义一系列的算法,将每一个算法封装起来,并让它们可以互相替换。策略模式让算法独立于使用它的客户而变化,是一种对象的行为模式。下面以排序算法来学习下策略模式。

如图是网上找到的一段资料:

排序算法配合策略模式代码实现

1. 策略模式一般包括一个环境类即为使用算法的角色,它在解决问题的时候采用多种策略。在其中维护一个抽象策略的引用实例,用于定义采用的所采用的策略,下文中定义类名为 Context。 

2. 抽象类或者接口,为所支持的算法声明抽象方法,是所有策略类的父类 ,我们使用Sort。

3. 具体的策略类,实现了上面的接口或者继承抽象类,实现其定义的抽象算法,在运行时具体类中的方法覆盖实现的抽象方法来完成某个业务处理。

(1) 环境类代码

package cn.aries.pattern.StrategyPattern;

public class Context {

    private Sort sortStrategy;

    public Context(Sort sortStrategy) {
        this.sortStrategy = sortStrategy;
    }
    
    public int[] sort(int[] arr){
        return sortStrategy.sort(arr);
    }
}

(2) 策略接口代码

package cn.aries.pattern.StrategyPattern;

public interface Sort {
    public int[] sort(int[] arr);
}

(3) 排序算法代码

 a. 选择排序

package cn.aries.pattern.StrategyPattern;

public class SelectionSort implements Sort {
    /**
     * 选择排序
     */
    @Override
    public int[] sort(int[] arr) {
        int len = arr.length;
        int temp;

        for (int i = 0; i < len; i++) {
            temp = arr[i];
            int index = i;
            for (int j = i + 1; j < len; j++) {
                if (arr[j] < temp) {
                    temp = arr[j];
                    index = j;
                }
            }
            arr[index] = arr[i];
            arr[i] = temp;
        }
        System.out.println("this is selection sort !");
        return arr;
    }
}

b. 冒泡排序

package cn.aries.pattern.StrategyPattern;

public class BubbleSort implements Sort{

    /**
     * 冒泡排序
     */
    @Override
    public int[] sort(int[] arr) {
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            for (int j = i+1; j < len; j++) {
                int temp;
                if(arr[i] > arr[j]){
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println("this is bubble sort !");
        return arr;
    }
}

c. 插入排序

package cn.aries.pattern.StrategyPattern;

public class InsertionSort implements Sort {

    /**
     * 插入排序法
     */
    @Override
    public int[] sort(int[] arr) {
        int len = arr.length;

        for (int i = 1; i < len; i++) {
            int temp = arr[i];
            int j;
            for (j = i; j > 0; j--) {
                if (arr[j - 1] > temp) {
                    arr[j] = arr[j - 1];
                } else {
                    break;
                }
            }
            arr[j] = temp;
        }
        System.out.println("this is insertion sort !");
        return arr;
    }
}

(4) 测试代码

package cn.aries.pattern.StrategyPattern;

public class App {
    public static void main(String[] args) {
        int[] arr = {8,4,5,2,62,2};
     //具体的这个策略类调用可以在配置文件中设定,这里创建不同的排序算法实例就会调用的不同策略的排序算法 Sort sortStrategy
= new SelectionSort(); Content content = new Content(sortStrategy); printArray(content.sort(arr)); } public static void printArray(int[] arr){ for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + ","); } } }

以上代码就是使用策略模式实现不同排序方法的调用。如果引入新的排序算法,对系统无任何影响,之需要添加一个新的具体策略类,在该策略类中封装新的算法,然后修改对应的配置文件应用该策略即可。

分析策略模式的优缺点

优点:

  1. 提供了对“开闭原则” 的完美支持,在不修改原代码的基础上,灵活的新增算法或者行为。

  2. 其定义了一个算法或者行为族,可以将公用的代码提取到继承的父类中,从了避免了重复的代码。

  3. 其将每个算法或者行为封装为一个类,就是一个类只做一间事情,符合“单一职责”原则。

  4. 可以避免使用多重条件转换语句if(){}else{},将选择使用什么算法的行为逻辑和算法分开,更易于维护。

缺点:

  客户端必须知道所有的策略类,并自行的决定选择使用哪一个策略类。客户端必须理解这些算法的区别,以便使用的使用选择恰当的算法类,就是策略模式只适用于客户端知道所有的算法和行为的情况。

回到开始项目中策略模式的运用

1. 每一个外部系统接入的时候,已经定义好了使用什么策略,然后将对应的策略写入数据库。

2. 每一个策略类都配置在了xml文件中。

3. 当外部系统提交数据过来的时候,根据外部系统名称到数据库中查找当时接入系统时选择的策略名称 strategyName 。

4. 在要调用策略的位置使用上下午容器ac.getBean("strategyName");获取到具体的策略类,就可以根据客户需求使用目标算法或者方式完成业务流程,类似如下代码:

    

其实最终的结论,在使用策略的时候,一个业务可能有多中执行路径或者执行方式供选择(也就是多个策略),但是具体走那一条,还是需要在调用的时候就间接的表示清楚,到此心中的谜团解开了。

 

设计模式之策略模式

策略模式属于对象行为型的设计模式定义:封装了一些列算法,它们之前可以相互替换,此模式使得算法的改变,不会影响到使用它们的客户端  策略模式有以下3个角色组成抽象策略类:所有策略类的父类,为所支持的... 查看详情

《设计模式之禅》之策略模式

一、策略模式的定义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使用的是面向对象的继承和多态机制,我们看看策略模式的三个... 查看详情

设计模式之策略模式

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

设计模式之策略模式

...,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。介绍意图... 查看详情

015设计模式之策略模式

抽象策略角色:策略类,通常由一个接口或者抽象类实现。-具体策略角色:包装了相关的算法和行为。-环境角色:持有一个策略类的引用,最终给客户端调用。 #pragmaonce//策略接口(纯虚函数)classIStrategypublic: IStrategy() virtual~IStrate... 查看详情

大话设计模式之策略模式

策略模式  定义了一系列的算法,分别封装起来,让他们之间可以互相替换。此模式让算法的改变不会影响到使用算法的客户。  在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对... 查看详情

设计模式之策略模式

  软件工程师都会学习设计模式,设计模式可以说是前人智慧与经验的结晶,虽然不是哪里都用得到,但是在合适的地方使用合适的设计模式,能够带来巨大的收益。我通过学习《headfirst设计模式》,逐渐掌握这些设计方法,... 查看详情

java设计模式之策略模式

    策略模式属于对象的行为模式,策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式使这些算法在客户端调用它们... 查看详情

java设计模式之策略模式

...此模式让算法的变化,不会影响到使用算法的客户(大话设计模式)。策略模式UML图      策略模式代码   古代的各种计谋都是一种策略,这次我们的例子就拿其中一种离间计来写的,理解起来非常容易,代码... 查看详情

设计模式之策略模式20170720

行为型设计模式之策略模式:一、含义策略模式是一种比较简单的模式,也叫做政策模式,其定义如下:定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二、... 查看详情

设计模式之-策略模式(strategypattern)(代码片段)

...,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的context对象。策略对象改变context对象的执行算法。 C++实... 查看详情

设计模式之策略模式(代码片段)

设计模式之策略模式  策略模式(StraregyPattern)是一种比较简单的模式,也叫政策模式(PolicyPattern),定义如下:Defineafamilyofalgorithms,encapsulateeachone,andmaketheminterchangeable.(定义一组算法,将每个算法都封装起来,并... 查看详情

设计模式之策略模式

目录 策略模式介绍鸭子事例简单的鸭子会飞的鸭子橡皮鸭登场噩梦开始策略模式鸭子策略模式介绍策略模式就是将功能定义为算法簇,分别封装起来,让他们之间可以替换,此模式可以让算法的变化独立于使用算法... 查看详情

设计模式之策略模式

设计模式之策略模式Jul23,2015策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。正文在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数... 查看详情

java设计模式之策略模式

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

设计模式:helloworld之策略模式

一.概述策略模式定义了算法族,分别封装起来,让他们可以互相替换,此模式让算法的变化独立于使用算法的客户。策略模式的三要素:抽象策略角色:策略类,通常由一个接口或者抽象类实现。具体策略角色:包装了相关的... 查看详情

《设计模式之禅》--策略扩展:策略枚举

接上篇《设计模式之禅》--代理扩展:动态代理需求:加减法计算publicenumCalculator{//加法运算ADD("+"){publicintexec(inta,intb){returna+b;}},//减法运算SUB("-"){publicintexec(inta,intb){returna-b;}};Stringvalue="";//定义成员值类型privateCalculator(S 查看详情

设计模式之桥梁模式和策略模式的差别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式。下面是它们的UML结构图。桥梁模式:策略模式:在桥接模式中,Abstraction通过聚合的方式引用Implementor。举一个样例:策略模式:我要画圆。要实心圆,... 查看详情