zoukankan      html  css  js  c++  java
  • 图解设计模式-Builder模式

    用于组装具有复杂结构的实例叫做Builder模式。
    抽象类Builder中定义了组装需要用的所用方法。
    抽象类的每种具体实现(TextBuilder于HTMLBuilder)中定义了各自的组装时需要的个性化方法。
    Director组装类中定义了组装的顺序。
     
    角色:
    Builder建造者:负责定义用于生成实例的接口API。Builder角色中准备了用于生成实例的方法。示例中由Builder类扮演。
    ConcreteBuilder具体的建造者:负责实现Builder角色的接口类,这里定义了在生成实例时实际被调用的方法。有TextBuilder于HTMLBuilder类扮演。
    Director监工:使用Builder具体类中声明的方法来编写文档。它不依赖与具体的类,,为了确保不论ConcreteBuilder角色如何定义,Director角色都能正常工作,它只调用在Builder抽象类中定义的方法。
    Client使用者:使用Builder模式,Main方法。
    优点:
    针对抽象类编写,不针对具体类编程,解耦。
    组装的具体实现被隐藏在Director类中。
    Director类中定义了具体的construct方法,使用了Template Method模式。
     
    代码:
    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();
    }
    public class Director {
        private Builder builder;
        public Director(Builder builder) {
            this.builder = builder;
        }
        //规定了组装的顺序
        public void construct() {
            builder.makeTitle("标题");
            builder.makeString("内容内容内容内容1");
            builder.makeItems(new String[] {"条目1","条目2"});
            builder.makeString("内容内容内容内容2");
            builder.makeItems(new String[] {"条目3","条目4"});
            builder.close();
        }
    }
    
    //构建text时,每个方法(组件)需要实现内容
    public class TextBuilder extends Builder {
        private StringBuilder stringBuilder = new StringBuilder();
        //定义了各自的组装时需要的个性化方法
        @Override
        public void makeTitle(String title) {
            stringBuilder.append(title);
            stringBuilder.append("
    ");
        }
    
        @Override
        public void makeString(String str) {
            stringBuilder.append(str);
            stringBuilder.append("
    ");
        }
    
        @Override
        public void makeItems(String[] items) {
            for(int i=0;i<items.length;i++) {
                stringBuilder.append(items[i]);
            }
            stringBuilder.append("
    ");
        }
    
        @Override
        public void close() {
            stringBuilder.append("==========================");
            stringBuilder.append("
    ");
        }
    
        public String getResult() {
            return  stringBuilder.toString();
        }
    }
    //构建Html时,每个方法(组件)需要实现内容
    public class HtmlBuilder extends Builder{
        private String filename;
        private PrintWriter printWriter;
        //定义了各自的组装时需要的个性化方法
        @Override
        public void makeTitle(String title) {
            filename = title + ".html";
            try {
                printWriter = new PrintWriter(new FileWriter("d:\"+filename));
                printWriter.println(title);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        @Override
        public void makeString(String str) {
            printWriter.println(str);
        }
    
        @Override
        public void makeItems(String[] items) {
            for(int i=0;i<items.length;i++) {
                printWriter.print(items[i]);
            }
            printWriter.println("");
        }
    
        @Override
        public void close() {
            printWriter.println("==========================");
            printWriter.close();
        }
    
        public String getResult() {
            return  filename;
        }
    }
    public class Main {
    
        public static void main(String[] args) {
            //构建text
            TextBuilder textBuilder = new TextBuilder();
            Director director = new Director(textBuilder);
            //进行构建
            director.construct();
            String result = textBuilder.getResult();
            System.out.println(result);
    
            //构建Html
            HtmlBuilder htmlBuilder = new HtmlBuilder();
            director = new Director(htmlBuilder);
            //进行构建
            director.construct();
            String resultHtml = htmlBuilder.getResult();
            System.out.println(resultHtml);
        }
    }
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    ABP理论学习之Swagger UI集成
    最佳加法表达式
    洛谷 P1736 创意吃鱼法
    洛谷P1387 最大正方形
    1078 最小生成树
    判断元素是否存在
    1531 山峰 【栈的应用】
    洛谷 P2335 [SDOI2005]位图
    矿藏估价
    二分法小结
  • 原文地址:https://www.cnblogs.com/use-D/p/9581453.html
Copyright © 2011-2022 走看看