<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="">设计的原则是将易变的元素与稳定的元素分开。</span><span lang="EN-US"><span style="font-family: Calibri;">separate things that change from things that stay the same.</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="">设计模式的目标是把变化封装起来。</span><span lang="EN-US"><span style="font-family: Calibri;">The goal of design patterns is to encapsulate change.</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style=""><span style="font-size: small;">要着手构思一个设计模式之前,扪心自问:“这里真的需要使用继承吗?使用继承的话有什么好处?”</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">GoF</span></span><span style="">的</span><span lang="EN-US"><span style="font-family: Calibri;">23</span></span><span style="">个设计模式分为三类:创建型(</span><span lang="EN-US"><span style="font-family: Calibri;">creational</span></span><span style="">)、结构型(</span><span lang="EN-US"><span style="font-family: Calibri;">structural</span></span><span style="">)、行为型(</span><span lang="EN-US"><span style="font-family: Calibri;">behavioral</span></span><span style="">)。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Fonctor</span></span><span style="">:将</span><span lang="EN-US"><span style="font-family: Calibri;">fonction</span></span><span style="">包装到类中。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Singleton</span></span><span style="">:只能有一个对象的类。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Command</span></span><span style="">:将函数行为与调用地点分离。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style=""><span style="font-size: small;">使用代理的四种场合:</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">1.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style=""><span style="font-size: small;">远程代理。</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style=""><span style="font-size: small;">虚拟代理。提供“懒惰初始化”,主要用于开销庞大的对象,可以只在需要这样的对象时才构建对象。</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">3.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style=""><span style="font-size: small;">保护性代理。用于保护代理对象,避免用户取得完全访问权。</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">4.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Smart reference</span></span><span style="">。在访问代理对象时附加一些行为。引用计数是一个例子:记录一个特定对象被引用的次数,用于应用写时复制(</span><span lang="EN-US"><span style="font-family: Calibri;">copy-on-write</span></span><span style="">)并防止对象混淆。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Factory</span></span><span style="">和</span><span lang="EN-US"><span style="font-family: Calibri;">Builder</span></span><span style="">的主要区别是:</span><span lang="EN-US"><span style="font-family: Calibri;">Builder</span></span><span style="">生成的是一个整体的各个部件,而</span><span lang="EN-US"><span style="font-family: Calibri;">Factory</span></span><span style="">生成的是不同的整体。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Observer</span></span><span style="">:解决某对象改变状态时,一批对象需要更新的问题。</span><span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Multiple dispatching</span></span><span style="">多重分派:解决多重对象相互交互情况下的分派问题,如不同数据类型的加、减、乘、除等运算。</span><span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span style="">设计模式的目标是把变化封装起来。</span><span lang="EN-US"><span style="font-family: Calibri;">The goal of design patterns is to encapsulate change.</span></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style=""><span style="font-size: small;">要着手构思一个设计模式之前,扪心自问:“这里真的需要使用继承吗?使用继承的话有什么好处?”</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">GoF</span></span><span style="">的</span><span lang="EN-US"><span style="font-family: Calibri;">23</span></span><span style="">个设计模式分为三类:创建型(</span><span lang="EN-US"><span style="font-family: Calibri;">creational</span></span><span style="">)、结构型(</span><span lang="EN-US"><span style="font-family: Calibri;">structural</span></span><span style="">)、行为型(</span><span lang="EN-US"><span style="font-family: Calibri;">behavioral</span></span><span style="">)。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Fonctor</span></span><span style="">:将</span><span lang="EN-US"><span style="font-family: Calibri;">fonction</span></span><span style="">包装到类中。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Singleton</span></span><span style="">:只能有一个对象的类。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Command</span></span><span style="">:将函数行为与调用地点分离。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style=""><span style="font-size: small;">使用代理的四种场合:</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">1.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style=""><span style="font-size: small;">远程代理。</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">2.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style=""><span style="font-size: small;">虚拟代理。提供“懒惰初始化”,主要用于开销庞大的对象,可以只在需要这样的对象时才构建对象。</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">3.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style=""><span style="font-size: small;">保护性代理。用于保护代理对象,避免用户取得完全访问权。</span></span></p>
<p class="MsoListParagraph" style=""><span style="" lang="EN-US"><span style=""><span style="font-size: small; font-family: Calibri;">4.</span><span style='font: 7pt "Times New Roman";'> </span></span></span><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Smart reference</span></span><span style="">。在访问代理对象时附加一些行为。引用计数是一个例子:记录一个特定对象被引用的次数,用于应用写时复制(</span><span lang="EN-US"><span style="font-family: Calibri;">copy-on-write</span></span><span style="">)并防止对象混淆。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Factory</span></span><span style="">和</span><span lang="EN-US"><span style="font-family: Calibri;">Builder</span></span><span style="">的主要区别是:</span><span lang="EN-US"><span style="font-family: Calibri;">Builder</span></span><span style="">生成的是一个整体的各个部件,而</span><span lang="EN-US"><span style="font-family: Calibri;">Factory</span></span><span style="">生成的是不同的整体。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Observer</span></span><span style="">:解决某对象改变状态时,一批对象需要更新的问题。</span><span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US"><span style="font-family: Calibri;">Multiple dispatching</span></span><span style="">多重分派:解决多重对象相互交互情况下的分派问题,如不同数据类型的加、减、乘、除等运算。</span><span lang="EN-US"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Calibri;"></span></span></p>