Java设计模式之建造者模式

Posted 此账户已注销或冻结

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java设计模式之建造者模式相关的知识,希望对你有一定的参考价值。

概论

 什么是建造者模式呢?将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

 

建造者模式示例

我们先来回忆一下在模板模式中的 示例,[内外部系统交互]中的四个步骤:

第一步:参数校验

第二步:封装对外的请求参数

第三步:对外提交请求

第四步:后置处理,例如记录操作日志

 

最后核心的算法设计在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 }

 

以上是关于Java设计模式之建造者模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式之-建造者模式

Java设计模式之(建造者模式)

JAVA设计模式之建造者模式

JAVA设计模式之建造者模式

Java设计模式之建造者模式(Builder Pattern)

Java设计模式之建造者模式(Builder Pattern)