JavaBuilder模式

本文最后更新于:10 个月前

组装复杂的实例

1 - 定义了决定文档结构的方法的抽象类

public abstract class Builder {
    public abstract void makeTitle(String title);
    public abstract void makeString(String str);
    public abstract void makeItems(String[] items);
    public abstract void close();
}

2 - 编写一个文档的类

public class Director {
    private Builder builder;

    public Director(Builder builder){
        this.builder = builder;
    }

    public void construct(){
        builder.makeTitle("Greeting");
        builder.makeString("从早上至下午");
        builder.makeItems(new String[] {
                "早上好.",
                "下午好."
        });
        builder.makeString("晚上");
        builder.makeItems(new String[] {
                "晚上好.",
                "晚安.",
                "再见."
        });
        builder.close();
    }
}

3 - 使用纯文本(普通字符串)编写文档的类

public class TextBuilder extends Builder{
    private StringBuffer buffer = new StringBuffer();

    @Override
    public void makeTitle(String title) {
        buffer.append("=================================\n");
        buffer.append("[").append(title).append("]\n");
        buffer.append("\n");
    }

    @Override
    public void makeString(String str) {
        buffer.append('*').append(str).append("\n");
        buffer.append("\n");
    }

    @Override
    public void makeItems(String[] items) {
        for (String item : items) {
            buffer.append(" -").append(item).append("\n");
        }
        buffer.append("\n");
    }

    @Override
    public void close() {
        buffer.append("=================================\n");
    }

    public String getResult(){
        return buffer.toString();
    }
}

4 - 使用HTML编写文档的类

public class HTMLBuilder extends Builder{
    private String filename;
    private PrintWriter writer;

    @Override
    public void makeTitle(String title) {
        filename = title + ".html";
        try {
            writer = new PrintWriter(new FileWriter(filename));
        }catch (IOException e){
            e.printStackTrace();
        }
        writer.println("<html><head><title>" + title + "</title></head><body>");
        writer.println("<h1>" + title + "</h1>");
    }

    @Override
    public void makeString(String str) {
        writer.println("<p>" + str + "</p>");
    }

    @Override
    public void makeItems(String[] items) {
        writer.println("<ul>");
        for (String item : items) {
            writer.println("<li>" + item + "</li>");
        }
        writer.println("</ul>");
    }

    @Override
    public void close() {
        writer.println("</body></html>");
        writer.close();
    }

    public String getFilename(){
        return filename;
    }
}

5 - 测试程序行为的类

// 需要提前设置好args的参数
public class Main5 {
    public static void main(String[] args) {
        if (args.length != 1) {
            usage();
            System.exit(0);
        }

        if (args[0].equals("plain")){
            TextBuilder textBuilder = new TextBuilder();
            Director director = new Director(textBuilder);
            director.construct();
            String result = textBuilder.getResult();
            System.out.println(result);
        }else if (args[0].equals("html")){
            HTMLBuilder htmlBuilder = new HTMLBuilder();
            Director director = new Director(htmlBuilder);
            director.construct();
            String filename = htmlBuilder.getFilename();
            System.out.println(filename + "文件编写完成");
        }else {
            usage();
            System.exit(0);
        }
    }

    public static void usage(){
        System.out.println("Usage: java Main plain      编写纯文本文档");
        System.out.println("Usage: java Main html       编写HTML文档");
    }
}

6 - 输出示例

6.1 Usage: java Main plain 编写纯文本文档

=================================
    [Greeting]

    *从早上至下午

    -早上好.
    -下午好.

    *晚上

    -晚上好.
    -晚安.
    -再见.

=================================

6.2 Usage: java Main html 编写HTML文档

Greeting.html文件编写完成

****HTML文本****
 <html><head><title>Greeting</title></head><body>
<h1>Greeting</h1>
<p>从早上至下午</p>
<ul>
<li>早上好.</li>
<li>下午好.</li>
</ul>
<p>晚上</p>
<ul>
<li>晚上好.</li>
<li>晚安.</li>
<li>再见.</li>
</ul>
</body></html>

在进行一些复杂实例的组装中我们经常用到如下模式


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!