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

由于很多外部系统接入,所以系统提供多种审批链的生成方式供外部系统选择,比如 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");获取到具体的策略类,就可以根据客户需求使用目标算法或者方式完成业务流程,类似如下代码:

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

设计模式之 - 策略模式(Strategy Pattern)的更多相关文章

  1. 乐在其中设计模式(C#) - 策略模式(Strategy Pattern)

    原文:乐在其中设计模式(C#) - 策略模式(Strategy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 策略模式(Strategy Pattern) 作者:webabc ...

  2. 反馈法学习设计模式(一)——策略模式Strategy Pattern

    简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...

  3. 8.6 GOF设计模式四: 策略模式… Strategy Pattern

    策略模式… Strategy Pattern  在POS系统中,有时需要实行价格优惠, 该如何处理?  对普通客户或新客户报全价  对老客户统一折扣5%  对大客户统一折扣10%  注:课件 ...

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

    策略模式(Strategy Pattern) 介绍定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法的变化可独立于使用它的客户. 示例有一个Message实体类,对它的操作有 ...

  5. 设计模式原来如此-策略模式(Strategy Pattern)

    策略模式中体现了两个非常基本的面向对象设计的原则:1.封装变化的概念.2.编程中使用接口,而不是对接口的实现. 策略模式的定义:定义一组算法,将每个算法都封装起来,并使它们之间可以互换.策略模式使这些 ...

  6. 【UE4 设计模式】策略模式 Strategy Pattern

    概述 描述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法的变化不会影响到使用算法的客户. 套路 Context(环境类) 负责使用算法策略,其中维持了一 ...

  7. 设计模式(一):“穿越火线”中的“策略模式”(Strategy Pattern)

    在前段时间呢陆陆续续的更新了一系列关于重构的文章.在重构我们既有的代码时,往往会用到设计模式.在之前重构系列的博客中,我们在重构时用到了“工厂模式”.“策略模式”.“状态模式”等.当然在重构时,有的地 ...

  8. 设计模式 - 策略模式(Strategy Pattern) 具体解释

    策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...

  9. HeadFirst设计模式读书笔记(1)-策略模式(Strategy Pattern)

    策略模式(Strategy Pattern): 定义了了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户端. 第一个设计原则:找出应用中可能需要变化之处,把他们独立 ...

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

    在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 ...

随机推荐

  1. ionic3中NavController类push setRoot相关问题解决

    今天在测试app的时候发现,登录页跳转到首页后,会加载两次数据.百思不得其解,查看了所有代码也没能发现问题.最终抱着尝试的态度,动了如下代码: if (suc) { //this.navCtrl.pu ...

  2. PHP求解一个值是否为质数

    /** * 求解一个值是否为质数 * * @param $a * @return int 0是 1不是 */ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 function ...

  3. 开源:Sagit.Framework For IOS 开发框架

    一:创造Sagit开发框架的起因: 记得IT连创业刚进行时,招了个IOS的女生做开发,然后: ----------女生的事故就此开始了----------- 1:面试时候:有作品,态度也不错,感觉应该 ...

  4. Akka(43): Http:SSE-Server Sent Event - 服务端主推消息

    因为我了解Akka-http的主要目的不是为了有关Web-Server的编程,而是想实现一套系统集成的api,所以也需要考虑由服务端主动向客户端发送指令的应用场景.比如一个零售店管理平台的服务端在完成 ...

  5. 使用REST风格架构您需要知道的一些事

    1. REST的由来 2. REST的构成 2.1. 资源 2.2. 资源的表述 2.2.1. MIME(Multipurpose Internet Mail Extensions) 2.2.2. 缓 ...

  6. 分享Sql Server 2008 r2 数据备份,同步服务器数据(一.本地备份)

    最近在部署一个系统,处于数据安全的考虑,因此对相应的数据库服务器定时备份,以及数据同步到备份服务上.之前在另外的一个项目中也做过相应的操作,但是操作都是按照查找到的文章一步一步的操作,碰到一些细节问题 ...

  7. PTA题---求两个有序序列中位数所体现的思想。

    ---恢复内容开始--- 近日,在做PTA题目时,遇到了一个这样的题,困扰了很久.题目如下:已知有两个等长的非降序序列S1, S2, 设计函数求S1与S2并集的中位数.有序序列A​0​​,A​1​​, ...

  8. mongoDB之集合操作

    mongoDB之集合操作 mongoDB中的集合相当于mysql中的表. mongoDB中集合的创建: 第一种方式:不限制集合大小   db.createCollection("集合名称&q ...

  9. 资源向导之 &quot;APUE&quot;

    APUE --- Advanced programming in the unix environment 这本书我看了好多遍.... 原因嘛, 第一次看到进程那里,看不懂了,前面基础没看好,从头再来 ...

  10. 关于Mac终端故障一直出现 [进程已完毕]

    终端已打开就出现以下信息.无法输入不论什么的命令 Last login: Mon Aug 18 10:00:36 on ttys000 [进程已完毕] 原因:不知谁改动了 终端->偏好设置-&g ...