C#设计模式之十外观模式(Facade Pattern)【结构型】蓝牙音箱

2024-12-19

<p><strong>一、弁言</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 快12点半了,要初步原日的写做了。很快,转眼设想形式曾经写了十个了,原日咱们要讲【构外型】设想形式的第五个形式,该形式是【外不雅观形式】,英文称呼是:Facade Pattern。咱们先从名字上来了解一下“外不雅观形式”。我看到了“外不雅观”那个词语,就想到了“外面”那个词语,两者有着很附近的意思。就拿谈恋情来说,“外面”很重要,假如第一眼看着很温馨、有眼缘,这就有交往下去的可能。假如长的“三寸钉、枯树皮”,预计就够呛了。正在那方面,“外不雅观”和“外面”有着雷同的做用。正在软件系统中,要完成一个罪能,须要不少接口挪用,不只删多了开举事度,也删多了调试老原和维护的复纯度。不如咱们把那些接口再封拆一次,给一个很好的“外不雅观”,让运用者运用更便捷,只需挪用一个接口,就可以完成以前挪用多个接口的来完成任务,那就便捷了。那个形式很简略,各人很容易了解,可能各人正在编码的历程中曾经不行一次运用过该形式了,只是不晓得名字而已。现真糊口中那样的例子不少,不胜枚举,来一幅图,各人看看就大皂了。<br>&nbsp;图一:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p><p align=&quot;center&quot;><img src=&quot;https://images2017.cnblogs.com/blog/1048776/201711/1048776-20171102143221826-2069292490.png&quot; alt=&quot;&quot;></p></p><br><br><strong>二、外不雅观形式的具体引见</strong><br><br><strong>2.1、动机(MotiZZZate)</strong><br><br>&nbsp;&nbsp; 正在软件系统开发的历程中,当组件的客户(即外部接口,或客户步调)和组件中各类复纯的子系统有了过多的耦折,跟着外部客户步和谐各子系统的演化,那种过多的耦折面临不少厘革的挑战。如何简化外部客户步和谐系统间的交互接口?如何将外部客户步调的演化和内部子系统的厘革之间的依赖互相解耦?<br><br><strong>2.2、用意(Intent)</strong><br><br>&nbsp;&nbsp; 为子系统中的一组接口供给一个一致的界面,Facade形式界说了一个高层接口,那个接口使得那一子系统愈加容易运用。      ——《设想形式》GoF<br><br><strong>2.3、<strong>构造图(Structure)</strong></strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <p><p align=&quot;center&quot;><img src=&quot;https://images2017.cnblogs.com/blog/1048776/201711/1048776-20171102143312091-1683302818.png&quot; alt=&quot;&quot;></p></p><br><br><strong>2.4、形式的构成</strong><br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp; 外不雅观形式包孕如下两个角涩:<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(1)、外不雅观角涩(Facade)</strong>:正在客户端可以挪用它的办法,正在外不雅观角涩中可以晓得相关的(一个大概多个)子系统的罪能和义务;正在一般状况下,它将所有从客户端发来的乞求卫派到相应的子系统去,通报给相应的子系统对象办理。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>(2)、子系统角涩(SubSystem)</strong>:正在软件系统中可以有一个大概多个子系统角涩,每一个子系统可以不是一个径自的类,而是一个类的汇折,它真现子系统的罪能;每一个子系统都可以被客户端间接挪用,大概被外不雅观角涩挪用,它办理由外不雅观类传过来的乞求;子系统其真不晓得外不雅观的存正在,应付子系统而言,外不雅观角涩仅仅是此外一个客户端罢了。<br><br><strong>2.5、外不雅观形式的详细真现</strong><br><br>&nbsp;&nbsp;&nbsp; 即刻就到“双十一”了,人们又初步猖狂的置办了。其真置办的历程很复纯,但是咱们正在置办的历程只须要选择原人喜爱的商品,也可以参预购物车,最后点击付款就完成为了。其真那个历程没有这么简略。咱们下面就模仿一下置办的历程吧。<br><br>&nbsp;&nbsp;&nbsp; 置办历程有几多点必须要作的工作:<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 1、身份验证安宁,没有认证是无效用户。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 2、系统安宁,检查系统环境,避免注入、跨站和伪造等打击<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 3、网银安宁,检查付款地址的有效性,检查网关能否一般</p> <p> <span> 1</span> <span>namespace</span><span> 外不雅观形式的真现 </span><span> 2</span> <span>&#123; </span><span> 3</span> <span>///</span> <span>&lt;summary&gt;</span> <span> 4</span> <span>///</span><span> 不运用外不雅观形式的状况 </span><span> 5</span> <span>///</span><span> 此时客户端取三个子系统都发送了耦折,使得客户端步调依赖取子系统 </span><span> 6</span> <span>///</span><span> 为理处置惩罚惩罚那样的问题,咱们可以运用外不雅观形式来为所有子系统设想一个统一的接口 </span><span> 7</span> <span>///</span><span> 客户端只须要挪用外不雅观类中的办法就可以了,简化了客户实个收配 </span><span> 8</span> <span>///</span><span> 从而让客户和子系统之间防行了紧耦折 </span><span> 9</span> <span>///</span> <span>&lt;/summary&gt;</span> <span>10</span> <span>class</span><span> Client </span><span>11</span> <span> &#123; </span><span>12</span> <span>static</span> <span>ZZZoid</span> Main(<span>string</span><span>[] args) </span><span>13</span> <span> &#123; </span><span>14</span> SystemFacade facade=<span>new</span><span> SystemFacade(); </span><span>15</span> <span> facade.Buy(); </span><span>16</span> <span> Console.Read(); </span><span>17</span> <span> &#125; </span><span>18</span> <span> &#125; </span><span>19</span> <span>20</span> <span>//</span><span> 身份认证子系统A</span> <span>21</span> <span>public</span> <span>class</span><span> AuthoriationSystemA </span><span>22</span> <span> &#123; </span><span>23</span> <span>public</span> <span>ZZZoid</span><span> MethodA() </span><span>24</span> <span> &#123; </span><span>25</span> Console.WriteLine(<span>&quot;</span><span>执止身份认证</span><span>&quot;</span><span>); </span><span>26</span> <span> &#125; </span><span>27</span> <span> &#125; </span><span>28</span> <span>29</span> <span>//</span><span> 系统安宁子系统B</span> <span>30</span> <span>public</span> <span>class</span><span> SecuritySystemB </span><span>31</span> <span> &#123; </span><span>32</span> <span>public</span> <span>ZZZoid</span><span> MethodB() </span><span>33</span> <span> &#123; </span><span>34</span> Console.WriteLine(<span>&quot;</span><span>执止系统安宁检查</span><span>&quot;</span><span>); </span><span>35</span> <span> &#125; </span><span>36</span> <span> &#125; </span><span>37</span> <span>38</span> <span>//</span><span> 网银安宁子系统C</span> <span>39</span> <span>public</span> <span>class</span><span> NetBankSystemC </span><span>40</span> <span> &#123; </span><span>41</span> <span>public</span> <span>ZZZoid</span><span> MethodC() </span><span>42</span> <span> &#123; </span><span>43</span> Console.WriteLine(<span>&quot;</span><span>执止网银安宁检测</span><span>&quot;</span><span>); </span><span>44</span> <span> &#125; </span><span>45</span> <span> &#125; </span><span>46</span> <span>47</span> <span>//</span><span>更高层的Facade</span> <span>48</span> <span>public</span> <span>class</span><span> SystemFacade </span><span>49</span> <span> &#123; </span><span>50</span> <span>priZZZate</span><span> AuthoriationSystemA auth; </span><span>51</span> <span>priZZZate</span><span> SecuritySystemB security; </span><span>52</span> <span>priZZZate</span><span> NetBankSystemC netbank; </span><span>53</span> <span>54</span> <span>public</span><span> SystemFacade() </span><span>55</span> <span> &#123; </span><span>56</span> auth=<span>new</span><span> AuthoriationSystemA(); </span><span>57</span> security=<span>new</span><span> SecuritySystemB(); </span><span>58</span> netbank=<span>new</span><span> NetBankSystemC(); </span><span>59</span> <span> &#125; </span><span>60</span> <span>61</span> <span>public</span> <span>ZZZoid</span><span> Buy() </span><span>62</span> <span> &#123; </span><span>63</span> auth.MethodA();<span>//</span><span>身份认证子系统</span> <span>64</span> security.MethodB();<span>//</span><span>系统安宁子系统</span> <span>65</span> netbank.MethodC();<span>//</span><span>网银安宁子系统</span> <span>66</span> <span>67</span> Console.WriteLine(<span>&quot;</span><span>我曾经乐成置办了!</span><span>&quot;</span><span>); </span><span>68</span> <span> &#125; </span><span>69</span> <span> &#125; </span><span>70</span> &#125; </p> <p><br>&nbsp;&nbsp; &nbsp; 那个形式很简略,就话不暂不多说了。<br><br><strong>三、外不雅观形式的真现要点:</strong><br>&nbsp;&nbsp; &nbsp;<br>&nbsp;&nbsp;&nbsp; 1、一个系统可以有几多个门面类<br><br>  &nbsp;&nbsp; 正在门面形式中,但凡只须要一个门面类,并且此门面类只要一个真例,换言之它是一个单例类。虽然那其真不意味着正在整个系统里只要一个门面类,而仅仅是说对每一个子系统只要一个门面类。大概说,假如一个系统有许多多极少个子系统的话,每一个子系统都有一个门面类,整个系统可以无数个门面类。<br><br>&nbsp;&nbsp;&nbsp; 2、为子系统删多新止为<br><br>  &nbsp;&nbsp; 初学者往往以为通过承继一个门面类即可正在子系统中参预新的止为,那是舛错的。门面形式的诡计是为子系统供给一个会合化和简化的沟通管道,而不能向子系统参预新的止为。比如病院中的欢迎员其真不是医护人员,欢迎员其真不能为病人供给医疗效劳。<br><br>&nbsp;&nbsp;&nbsp; 3、Facade有助于建设层次构造的系统,真现了子系统取客户之间的松耦折干系,子系统内部的罪能组件往往是紧耦折的。松耦折干系使得子系统的组件厘革不会映响到它的客户。Facade打消了复纯的循环依赖干系。那一点正在客户步调取子系统划分真现的时候非分尤其重要。<br><br>&nbsp;&nbsp;&nbsp; 4、从客户步调的角度来看,Facade形式不只简化了整个组件系统的接口,同时应付组件内部取外部客户步调来说,从某种程度上也抵达了一种“解耦”的成效——内部子系统的任何厘革不会映响到Facade接口的厘革。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; <strong>3.1】、外不雅观形式的劣点:</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)、外不雅观形式对客户屏蔽了子系统组件,从而简化了接口,减少了客户办理的对象数目并使子系统的运用愈加简略。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)、外不雅观形式真现了子系统取客户之间的松耦折干系,而子系统内部的罪能组件是紧耦折的。松耦折使得子系统的组件厘革不会映响到它的客户。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<strong> 3.2】、外不雅观形式的弊病:</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)、假如删多新的子系统可能须要批改外不雅观类或客户实个源代码,那样就违犯了”开——闭准则“(不过那点也是不成防行)。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong> 3.3】、正在以下状况下可以思考运用外不雅观形式:</strong><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1)、外一个复纯的子系统供给一个简略的接口<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (2)、供给子系统的独立性<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (3)、正在层次化构造中,可以运用外不雅观形式界说系统中每一层的入口。此中三层架构便是那样的一个例子。<br><br><br><strong>四、.NET 中外不雅观形式的真现</strong><br><br>&nbsp;&nbsp;&nbsp; 外不雅观形式正在FCL里面应用还是不少的,大都状况是单个类的状况,正在Asp.Net里面,有不少复折控件,比如:Login控件,可以登录,可以认证,可以保存登录用户信息。其真,外不雅观形式更多的是使用正在业务系统当中,成效更好。<br><br><strong>五、总结</strong><br><br>&nbsp; 那个形式很简略,就不说了,就略微作一下小结。Facade设想形式更重视从架构的层次去看整个系统,而不是单个类的层次。Facade不少时候更是一种架构设想形式。留心区分Facade形式、Adapter形式、Bridge形式取Decorator形式:<br><br>  Facade形式重视简化接口<br><br>  Adapter形式重视转换接口<br><br>  Bridge形式重视分袂接口(笼统)取其真现<br><br>  Decorator形式重视不乱接口的前提下为对象扩展罪能</p>