原文:C#设计模式之十外不雅观模式(Facade Pattern)【布局型】
一、引言
快12点半了,要开始今天的写作了。很快,转眼设计模式已经写了十个了,,今天我们要讲【布局型】设计模式的第五个模式,该模式是【外不雅观模式】,英文名称是:Facade Pattern。我们先从名字上来理解一下“外不雅观模式”。我看到了“外不雅观”这个词语,就想到了“外表”这个词语,两者有着很附近的意思。就拿谈爱情来说,“外表”很重要,如果第一眼看着很舒服、有眼缘,那就有交往下去的可能。如果长的“三寸钉、枯树皮”,预计就够呛了。在这方面,“外不雅观”和“外表”有着不异的感化。在软件系统中,要完成一个成果,需要很多接口挪用,不只增加了开举事度,也增加了调试本钱和维护的庞大度。不如我们把这些接口再封装一次,给一个很好的“外不雅观”,让使用者使用更便利,只需挪用一个接口,就可以完成以前挪用多个接口的来完成任务,这就便利了。这个模式很简单,大家很容易理解,可能大家在编码的过程中已经不止一次使用过该模式了,只是不知道名字罢了。现实生活中这样的例子很多,举不胜举,来一幅图,大家看看就大白了。
图一:
二、外不雅观模式的详细介绍
2.1、动机(Motivate)
在软件系统开发的过程中,当组件的客户(即外部接口,或客户措施)和组件中各类庞大的子系统有了过多的耦合,跟着外部客户措施和各子系统的演化,这种过多的耦合面临很多变革的挑战。如何简化外部客户措施和系统间的交互接口?如何将外部客户措施的演化和内部子系统的变革之间的依赖彼此解耦?
2.2、意图(Intent)
为子系统中的一组接口供给一个一致的界面,Facade模式界说了一个高层接口,这个接口使得这一子系统越发容易使用。 ——《设计模式》GoF
2.3、布局图(Structure)
2.4、模式的构成
外不雅观模式包罗如下两个角色:
(1)、外不雅观角色(Facade):在客户端可以挪用它的要领,在外不雅观角色中可以知道相关的(一个或者多个)子系统的成果和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,通报给相应的子系统东西措置惩罚惩罚。
(2)、子系统角色(SubSystem):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的调集,它实现子系统的成果;每一个子系统都可以被客户端直接挪用,或者被外不雅观角色挪用,它措置惩罚惩罚由外不雅观类传过来的请求;子系统并不知道外不雅观的存在,对付子系统而言,外不雅观角色仅仅是此外一个客户端而已。
2.5、外不雅观模式的具体实现
顿时就到“双十一”了,人们又开始猖獗的采办了。其实采办的过程很庞大,但是我们在采办的过程只需要选择本身喜欢的商品,也可以插手购物车,最后点击付款就完成了。其实这个过程没有那么简单。我们下面就仿照一下采办的过程吧。
采办过程有几点必需要做的工作:
1、身份验证安适,没有认证是无效用户。
2、系统安适,查抄系统环境,防备注入、跨站和伪造等打击
3、网银安适,查抄付款地点的有效性,查抄网关是否正常
1 namespace 外不雅观模式的实现 2 { 3 /// <summary> 4 /// 不使用外不雅观模式的情况 5 /// 此时客户端与三个子系统都发送了耦合,使得客户端措施依赖与子系统 6 /// 为了解决这样的问题,我们可以使用外不雅观模式来为所有子系统设计一个统一的接口 7 /// 客户端只需要挪用外不雅观类中的要领就可以了,简化了客户真个操纵 8 /// 从而让客户和子系统之间制止了紧耦合 9 /// </summary> 10 class Client 11 { 12 static void Main(string[] args) 13 { 14 SystemFacade facade=new SystemFacade(); 15 facade.Buy(); 16 Console.Read(); 17 } 18 } 19 20 // 身份认证子系统A 21 public class AuthoriationSystemA 22 { 23 public void MethodA() 24 { 25 Console.WriteLine("执行身份认证"); 26 } 27 } 28 29 // 系统安适子系统B 30 public class SecuritySystemB 31 { 32 public void MethodB() 33 { 34 Console.WriteLine("执行系统安适查抄"); 35 } 36 } 37 38 // 网银安适子系统C 39 public class NetBankSystemC 40 { 41 public void MethodC() 42 { 43 Console.WriteLine("执行网银安适检测"); 44 } 45 } 46 47 //更高层的Facade 48 public class SystemFacade 49 { 50 private AuthoriationSystemA auth; 51 private SecuritySystemB security; 52 private NetBankSystemC netbank; 53 54 public SystemFacade() 55 { 56 auth=new AuthoriationSystemA(); 57 security=new SecuritySystemB(); 58 netbank=new NetBankSystemC(); 59 } 60 61 public void Buy() 62 { 63 auth.MethodA();//身份认证子系统 64 security.MethodB();//系统安适子系统 65 netbank.MethodC();//网银安适子系统 66 67 Console.WriteLine("我已经告成采办了!"); 68 } 69 } 70 }