天天看點

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,如需轉載請自行聯系原作者

繼續閱讀