标签:外部 out arraylist 顺序 第一步 exception color 交换 str
概论
什么是建造者模式呢?将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式示例
我们先来回忆一下在模板模式中的 示例,[内外部系统交互]中的四个步骤:
第一步:参数校验
第二步:封装对外的请求参数
第三步:对外提交请求
第四步:后置处理,例如记录操作日志
最后核心的算法设计在run方法中。如下代码所示:
1 public void run (ExampleContext context) { 2 3 validate(context); 4 5 prepare(context); 6 7 proccess(context); 8 9 after(context); 10 }
客户端只要取调用run方法就可以。一切看来都很美好,但是如果我们想要把第一步和第二步交换执行顺序。或者把第二步舍弃。或者第三步和第四步交换执行顺序等等。
简单的描述一下问题:我们想要在一个算法中若干个步骤,客户端需要自定义步骤的顺序以及确定是否采用或者舍弃一些步骤。
此时需要用到建造者模式。首先我们需要有抽象产品类:
1 public abstract class AbstractProccessor { 2 3 private List<String> sequence = new ArrayList<String>(); 4 5 6 7 public boolean validate(ExampleContext context) { 8 if (context == null) { 9 return false; 10 } 11 12 return true; 13 } 14 15 public abstract void prepare(ExampleContext context); 16 17 public abstract void proccess(ExampleContext context); 18 19 public abstract void after(ExampleContext context); 20 21 protected boolean needAfterProccessing () { 22 return true; 23 } 24 25 26 public List<String> getSequence() { 27 return sequence; 28 } 29 30 public void setSequence(List<String> sequence) { 31 this.sequence = sequence; 32 } 33 34 public void run (ExampleContext context) { 35 36 for(String methodName : sequence) { 37 if(StringUtils.isEmpty(methodName)) { 38 continue; 39 } 40 41 Method method = null; 42 43 try { 44 method = this.getClass().getMethod(methodName, ExampleContext.class); 45 } catch (Exception e) { 46 47 } 48 49 if(method == null) { 50 continue; 51 } 52 53 try { 54 method.invoke(this, context); 55 } catch (Exception e) { 56 57 } 58 59 60 } 61 } 62 63 }
第3行:声明一个表示顺序的集合,集合中存储的是算法中每个步骤的方法名。类型为String类型。
第31行-61行:run方法通过遍历顺序集合的方式依次执行。通过反射的方式来调用。
接下来,和模板方法中的两个具体产品类完全一样,一个是HttpProccessor,另外一个是OtherProccessor。代码如下所示:
1 public class HttpProccessor extends AbstractProccessor { 2 3 protected boolean needAfterProccessing = false; 4 5 @Override 6 public void prepare(ExampleContext context) { 7 8 System.out.println("http 前置处理"); 9 10 } 11 12 @Override 13 public void proccess(ExampleContext context) { 14 15 System.out.println("http 提交请求"); 16 17 } 18 19 @Override 20 public void after(ExampleContext context) { 21 22 System.out.println("http 后置处理"); 23 24 } 25 26 }
1 public class OtherProccessor extends AbstractProccessor { 2 3 @Override 4 public void prepare(ExampleContext context) { 5 6 System.out.println("other 前置处理"); 7 8 } 9 10 @Override 11 public void proccess(ExampleContext context) { 12 13 System.out.println("other 提交请求"); 14 15 } 16 17 @Override 18 public void after(ExampleContext context) { 19 20 System.out.println("other 后置处理"); 21 22 } 23 }
标签:外部 out arraylist 顺序 第一步 exception color 交换 str
原文地址:https://www.cnblogs.com/sunshine798798/p/10032806.html