概论
什么是建造者模式呢? 将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示.
建造者模式示例
我们先来回忆一下在模板模式中的 示例,[内外部系统交互] 中的四个步骤:
第一步: 参数校验
第二步: 封装对外的请求参数
第三步: 对外提交请求
第四步: 后置处理, 例如记录操作日志
最后核心的算法设计在 run 方法中. 如下代码所示:
- public void run (ExampleContext context) {
- validate(context);
- prepare(context);
- proccess(context);
- after(context);
- }
客户端只要取调用 run 方法就可以. 一切看来都很美好, 但是如果我们想要把第一步和第二步交换执行顺序. 或者把第二步舍弃. 或者第三步和第四步交换执行顺序等等.
简单的描述一下问题: 我们想要在一个算法中若干个步骤, 客户端需要自定义步骤的顺序以及确定是否采用或者舍弃一些步骤.
此时需要用到建造者模式. 首先我们需要有抽象产品类:
- public abstract class AbstractProccessor {
- private List<String> sequence = new ArrayList<String>();
- public boolean validate(ExampleContext context) {
- if (context == null) {
- return false;
- }
- return true;
- }
- public abstract void prepare(ExampleContext context);
- public abstract void proccess(ExampleContext context);
- public abstract void after(ExampleContext context);
- protected boolean needAfterProccessing () {
- return true;
- }
- public List<String> getSequence() {
- return sequence;
- }
- public void setSequence(List<String> sequence) {
- this.sequence = sequence;
- }
- public void run (ExampleContext context) {
- for(String methodName : sequence) {
- if(StringUtils.isEmpty(methodName)) {
- continue;
- }
- Method method = null;
- try {
- method = this.getClass().getMethod(methodName, ExampleContext.class);
- } catch (Exception e) {
- }
- if(method == null) {
- continue;
- }
- try {
- method.invoke(this, context);
- } catch (Exception e) {
- }
- }
- }
- }
第 3 行: 声明一个表示顺序的集合, 集合中存储的是算法中每个步骤的方法名. 类型为 String 类型.
第 31 行 - 61 行: run 方法通过遍历顺序集合的方式依次执行. 通过反射的方式来调用.
接下来, 和模板方法中的两个具体产品类完全一样, 一个是 HttpProccessor, 另外一个是 OtherProccessor. 代码如下所示:
- public class HttpProccessor extends AbstractProccessor {
- protected boolean needAfterProccessing = false;
- @Override
- public void prepare(ExampleContext context) {
- System.out.println("http 前置处理");
- }
- @Override
- public void proccess(ExampleContext context) {
- System.out.println("http 提交请求");
- }
- @Override
- public void after(ExampleContext context) {
- System.out.println("http 后置处理");
- }
- }
- public class OtherProccessor extends AbstractProccessor {
- @Override
- public void prepare(ExampleContext context) {
- System.out.println("other 前置处理");
- }
- @Override
- public void proccess(ExampleContext context) {
- System.out.println("other 提交请求");
- }
- @Override
- public void after(ExampleContext context) {
- System.out.println("other 后置处理");
- }
- }
来源: http://www.bubuko.com/infodetail-2864678.html