标签:png const 使用 get 配置 private 项目开发 博客 统一
在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,Xml等具体的格式。
导出成文本或Xml等格式的数据时,一般都会有各自的格式,比如:导出的文件都有3个部分,文件头,内容,尾。
无论哪种导出格式,都需要3个部分,文件头,内容,尾等信息,并且他们的内容相同。即他们的构造算法固定,只是生成的结果不同;能不能把算法(构建)和结果(外观)分离出来呢?
将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
无论哪个导出格式均需要文件头,内容,尾,构建这三个部分就是定义中提到的构建过程,每种格式具体的步骤实现,就是不同的表示。接下来利用生成器模式解决上边的问题:
根据对问题的拆分,因为不同导出格式拥有相同的构建过程(算法),我们可以把构造头,内容,尾等方法写成一个接口,导出的不同格式通过实现这个接口,使得算法得到复用。
类图内容比较简单,就不一一介绍了。
public interface Builder { /** * * @param content */ public void buildContent(String content); /** * * @param header */ public void buildHeader(String header); /** * * @param tail */ public void buildTail(String tail); public void getResult(); }
public class TxtBuilder implements Builder { public TxtBuilder(){ } private String header; private String content; private String tail; public void finalize() throws Throwable { } /** * * @param content */ public void buildContent(String content){ this.content=content; System.out.println("构建Txt格式的文本内容:"+content); } /** * * @param header */ public void buildHeader(String header){ this.header=header; System.out.println("构建Txt格式的头部内容:"+header); } /** * * @param tail */ public void buildTail(String tail){ this.tail=tail; System.out.println("构建Txt格式的尾部内容:"+tail); } public void getResult(){ System.out.println("返回Txt格式的结果:"); System.out.println(header); System.out.println(content); System.out.println(tail); } }
public class XmlBuilder implements Builder { public XmlBuilder(){ } private String header; private String content; private String tail; public void finalize() throws Throwable { } /** * * @param content */ public void buildContent(String content){ this.content = content; System.out.println("构建Xml格式的详细内容"); } /** * * @param header */ public void buildHeader(String header){ this.header= header; System.out.println("构建Xml格式的头部内容"); } /** * * @param tail */ public void buildTail(String tail){ this.tail = tail; System.out.println("构建Xml格式的尾部内容"); } public void getResult(){ System.out.println("返回Xml格式的结果"); System.out.println(header); System.out.println(content); System.out.println(tail); } }
public class Director { public Builder m_Builder; public void finalize() throws Throwable { } /** * * @param builder */ public Director(Builder builder){ this.m_Builder = builder; } /** * * @param tail * @param content * @param header */ public void construct(String tail, String content, String header){ this.m_Builder.buildHeader(header); this.m_Builder.buildContent(content); this.m_Builder.buildTail(tail); } }
public class Client { public static void main(String args[]){ Builder xmlbuilder = new XmlBuilder(); Builder txtbuilder = new TxtBuilder(); Director director = new Director(xmlbuilder); director.construct("我是头部", "我是内容", "我是尾部"); xmlbuilder.getResult(); } }
生成器模式的构造过程是统一的,固定不变的,变化的部分放到生成器部分,只要配置不同的生成器,那么同样的构建过程就能构建出不同的产品来。
重点:
1.生成器模式主要由两部分组成:部件构造及装配,整体构建的算法。
2.将变化的部分和不变的部分分离出来。
当然,在实际项目中,生成器的使用往往不是这么简单的,毕竟生成器模式是应用于构造复杂对象的模式。
在生成器模式里面,指导者和生成器的交互是通过生成器的buildPart方法来完成的,在前面的实例中,指导者与生成器并没有太多的交互,而真正的项目开发中,指导者通常会实现比较复杂的算法或者运算过程,在实际中很可能会有一下情况:
通过上边的描述,可以看出,指导者与生成器之间是要有交互的,这只是可能的情况之一,需要如何实现,还得根据具体需要,这需要根据项目情况来决定。只要把握好设计模式的思想即可。
生成器的本质:分离整体构建算法和部件构造。
博主写博客不容易,转载注明出处:http://www.cnblogs.com/xiemubg/p/6107517.html
标签:png const 使用 get 配置 private 项目开发 博客 统一
原文地址:http://www.cnblogs.com/xiemubg/p/6107517.html