天天看点

C#设计模式之外观

IronMan之外观

接着上篇观察者内容的“剧情”,没看过的朋友也没关系,篇幅之间有衔接的关系但是影响不大。

需求:

为"兵工厂"提供各种支持,生产了各式各样的"IronMan",因为"IronMan"是智能的,它有一个"总控中心",用来使用各个部件的功能,以及 其它功能的使用。"总控中心"也是用户在穿戴时显示在用户眼前的UI。

现在遇到一个问题,大家都来看一下,"IronMan"在穿戴好启动的时候,"总控"会让"IronMan"各个部件自动自检,自检完成后要在UI那显示出 自检的结果,当然自检的顺序可以是固定的也可以是不固定的,随便怎么检查,最终是要返回所有的部件自检结果。

假设的基础结构情况:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>1     </code><code>public</code> <code>class</code> <code>Component1</code>

<code>2     {</code>

<code>3         </code><code>public</code> <code>void</code> <code>Component1Inspection()</code>

<code>4         {</code>

<code>5             </code><code>//部件1自检</code>

<code>6         }</code>

<code>7     }</code>

<code>8     </code><code>public</code> <code>class</code> <code>Component2</code>

<code>9     {</code>

<code>10         </code><code>public</code> <code>void</code> <code>Component2Inspection()</code>

<code>11         {</code>

<code>12             </code><code>//部件2自检</code>

<code>13         }</code>

<code>14     }</code>

<code>15     </code><code>public</code> <code>class</code> <code>Component3</code>

<code>16     {</code>

<code>17         </code><code>public</code> <code>void</code> <code>Component3Inspection()</code>

<code>18         {</code>

<code>19             </code><code>//部件3自检</code>

<code>20         }</code>

<code>21     }</code>

假设还有若干个部件,按照平常的状态它们都要一一的自检。在这样的情况下使用的代码则是这样的:

<code>1     </code><code>/// &lt;summary&gt;</code>

<code>2     </code><code>/// 控制中心</code>

<code>3     </code><code>/// &lt;/summary&gt;</code>

<code>4     </code><code>public</code> <code>class</code> <code>CenterController</code>

<code>5     {</code>

<code>6         </code><code>/// &lt;summary&gt;</code>

<code>7         </code><code>/// 启动时的行为</code>

<code>8         </code><code>/// &lt;/summary&gt;</code>

<code>9         </code><code>public</code> <code>void</code> <code>StartBef()</code>

<code>10         {</code>

<code>11             Component1 com1 = </code><code>new</code> <code>Component1();</code>

<code>12             com1.Component1Inspection();</code>

<code>13             Component2 com2 = </code><code>new</code> <code>Component2();</code>

<code>14             com2.Component2Inspection();</code>

<code>15             Component3 com3 = </code><code>new</code> <code>Component3();</code>

<code>16             com3.Component3Inspection();</code>

<code>17         }</code>

<code>18     }</code>

这样做下去的话是不是很费事,而且控制中心和部件的耦合度也比较大,如果部件个数自检的修改也会牵扯到控制中心内部的修改,这样的行为是违反设计原则的。

外观模式(Facade)的定义:为子系统中的一组接口提供一个一致的界面,用来访问子系统中的一群接口。

 根据设计模式的中心思想来做修改,把部件自检的操作都封装在单独的一层中,让控制中心和部件解耦,我们来看一下修改后的代码:

<code>1     </code><code>public</code> <code>class</code> <code>Facade</code>

<code>3         </code><code>//自检</code>

<code>4         </code><code>public</code> <code>void</code> <code>Inspection()</code>

<code>5         {</code>

<code>6             Component1 com1 = </code><code>new</code> <code>Component1();</code>

<code>7             com1.Component1Inspection();</code>

<code>8             Component2 com2 = </code><code>new</code> <code>Component2();</code>

<code>9             com2.Component2Inspection();</code>

<code>10             Component3 com3 = </code><code>new</code> <code>Component3();</code>

<code>11             com3.Component3Inspection();</code>

<code>12         }</code>

<code>13     }</code>

这样定义了外观类过后,再来看一下控制中心的调用修改:

<code>11             Facade facade = </code><code>new</code> <code>Facade();</code>

<code>12             facade.Inspection();</code>

在两层中间加入了Facade这一层,耦合的问题就迎刃而解,好像好多解耦的方式都是这样的。

END 下一篇是关于命令模式的说明。

     本文转自jinyuan0829 51CTO博客,原文链接:http://blog.51cto.com/jinyuan/1409295,如需转载请自行联系原作者