设计模式-责任链模式变体之管道模式

一.管道模式的定义

  管道模式(Pipeline Pattern) 是责任链模式(Chain of Responsibility Pattern)的常用变体之一。在管道模式中,管道扮演着流水线的角色,将数据传递到一个加工处理序列中,数据在每个步骤中被加工处理后,传递到下一个步骤进行加工处理,直到全部步骤处理完毕(比如电子厂里原材料通过流水线工人一个一个加工最后组装成一个完整的电子产品)。
  注:责任链模式只有一个处理器会处理数据,而管道模式是多个处理器会处理

二.什么情况下使用管道模式

  任务代码较为复杂,需求可拆分为多个子步骤,同时需求变更频繁,可能出现在任意位置添加新的子步骤、删除旧的子步骤、交换子步骤顺序,可以考虑使用管道模式。

三.使用管道模式的背景

  最开始做发送律师函系统时,发送律师函的功能,包括:“输入数据校验 -> 根据输入创建律师函 -> 保存律师函到相关 DB 表”总共三个步骤,也不算复杂,所以当时的代码比较简单大概是这样的:

/**
 * 律师函
 * @author Administrator
 *
 */
@Service
public class LetterServiceImpl implements LetterService {

	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Override
	public void sendLetter(LetterRequest request) {
		
		// 校验数据
		validatedData(request);
		
		//创建律师函
		createLetter(request);
		
		//保存律师函
		saveLetter(request);

	}

	private void saveLetter(LetterRequest request) {
		
		logger.info("保存律师函");
	}

	private void createLetter(LetterRequest request) {

		logger.info("创建律师函");
	}

	private void validatedData(LetterRequest request) {

		logger.info("校验律师函数据");
	}

}

  然而好景不长,随着业务不断完善,这块业务逻辑也越来越复杂,律师函模板也增多了,每个模板对应的数据处理方式有一定的区别,同时也需要增加律师函文件电子签章,存储到电子存证平台,后期可能还会有其他一些需求增加比如发送短信,发送邮件等等,基于目前的情况,我们可以在代码里直接封装方法,这样的话暂时可以偷懒一下,但是后期这块逻辑步骤越来越多,对于代码的改动是很大的且不利于维护,因此为了不给自己后期挖坑,同时也为了代码的维护和后期观看决定把这块代码优化一下,优化时打算使用责任链模式,但是责任链模式是一个处理器对其进行处理,而这个是多个步骤的,因此想到了责任链模式之变体“管道模式”。
  注: 直接在源代码上进行修改或增加违背了面向对象的 单一职责原则(一个类应该只发生一个变化)和开闭原则(对扩展开放,对修改关闭)

四.定义一个管道模板上下文

1.定义管道模板上下文 用于处理器处理相应的模板

/**
 * 律师函管道模板上下文
 * @author Administrator
 *
 */
@Setter
@Getter
public class PipelineTemplateContext {

	/**
	 * 模板名称
	 */
	private String templateName;
	/**
	 * 获取类名称
	 * @return
	 */
	public String getName() {
		return this.getClass().getSimpleName();
	}
}

五.构建管道处理器

1.创建一个管道处理器接口,定义一个方法处理数据

/**
 * 律师函管道处理器
 * @author Administrator
 *
 */
public interface LetterPipelineHandler {

	/**
	 * 管理处理器处理数据
	 * @param re

你可能感兴趣的:(设计模式)