0
点赞
收藏
分享

微信扫一扫

Aha!设计模式(14)-BUILDER(5)


效果

 

这里是Builder模式的主要效果:
1 ) 它使你可以改变一个产品的内部表示。

 

首先明确两个词。一是前面已经提到过《设计模式》书中将representation翻译成表示,作者认为应该译为表现;二是关于内部的理解。当我们用不同的方式盖两座大楼时,它们的内部当然不同,但是大多数情况下外部也会不同。所以作者认为,《设计模式》这部分内容中提到的内部,应该指的是隐藏在构建接口后面的那部分。

 

Builder对象提供给导向器一个构造产品的抽象接口。该接口使得生成器可以隐藏这个产品的表示和内部结构。它同时也隐藏了该产品是如何装配的。因为产品是通过抽象接口构造的,你在改变该产品的内部表示时所要做的只是定义一个新的生成器。

 

这段话的另一个问题就是所谓的表现,内部结构和如何装配的问题。

 

例如对于如下的Work文档。

 

Aha!设计模式(14)-BUILDER(5)_html

 

可以定义转换成其他格式的Builder:

 

Aha!设计模式(14)-BUILDER(5)_设计模_02

 

 

抽象接口只是定义了生成两种标题和正文的接口,具体的实现,例如如何表现,怎么装配等完全交给具象类。

 

对于HtmlBuilder,其生成的文件如下,除了红色粗体的文字以外,增加了非常多的信息,例如HTML版本,文件开始结束标记,META信息等等,等等。

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=gb2312">
<TITLE></TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice 4.1.5 (Win32)">
<META NAME="AUTHOR" CONTENT="Weiguo Xue">
<META NAME="CREATED" CONTENT="20180719;21550277">
<META NAME="CHANGEDBY" CONTENT="Weiguo Xue">
<META NAME="CHANGED" CONTENT="20180719;22204665">
<STYLE TYPE="text/css">
<!--
@page { margin: 2cm }
P { margin-bottom: 0.21cm }
A:link { so-language: zxx }
-->
</STYLE>
</HEAD>
<BODY LANG="ja-JP" DIR="LTR">
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US">Aha</SPAN></FONT></FONT><FONT SIZE=6 STYLE="font-size: 26pt"></FONT><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US">DesignPattern(15)-BUILDER(5)
</SPAN></FONT></FONT>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US"><STRONG><FONT COLOR="#000000"><SPAN STYLE="text-decoration: none"><SPAN STYLE="background: transparent">Consequences</SPAN></SPAN></FONT></STRONG></SPAN></FONT></FONT></P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><BR>
</P>
<P LANG="zh-CN" STYLE="margin-bottom: 0cm"><FONT FACE="Times New Roman, serif"><FONT SIZE=6 STYLE="font-size: 26pt"><SPAN LANG="en-US"><STRONG><FONT COLOR="#000000"><SPAN STYLE="text-decoration: none"><FONT SIZE=4><SPAN STYLE="background: transparent">Here
are key consequences of the Builder pattern:</SPAN></FONT></SPAN></FONT></STRONG></SPAN></FONT></FONT></P>
</BODY>
</HTML>

 

对于同样的接口,MarkDownBuilder生成以下的文档:

#

##

 

Here are key consequences of the Builder pattern:

增加的只有两个表示标题的标记:#和##。

 

作者观点

 

某位大师(据说是Andrew Koenig)说过:Abstraction is selective ignorance. (抽象就是有选择地装糊涂。) 。换句话说抽象就是选择性地将一部分信息隐藏起来,装作看不见。因为看不见,所以降低了耦合性。具体到Builder模式,隐藏了构建产品的细节,所以得到了生成不同产品的灵活性。

 

注:

 

本文中蓝色粗体文字都引自《设计模式》一书。

 

觉得本文有帮助?请分享给更多人。

阅读更多更新文章,请扫描下面二维码,关注微信公众号【面向对象思考】

Aha!设计模式(14)-BUILDER(5)_html_03

举报

相关推荐

0 条评论