C#设计模式之十外观模式(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 AuthoriationSystemA 22 23 void MethodA() 24 25 Console.WriteLine("执行身份认证"); 26 27 28 29 系统安全子系统B 30 SecuritySystemB 31 32 MethodB() 33 34 Console.WriteLine(执行系统安全检查35 36 37 38 网银安全子系统C 39 NetBankSystemC 40 41 MethodC() 42 43 Console.WriteLine(执行网银安全检测44 45 46 47 更高层的Facade 48 SystemFacade 49 { 50 private AuthoriationSystemA auth; 51 SecuritySystemB security; 52 NetBankSystemC netbank; 53 54 public SystemFacade() 55 { 56 auth= AuthoriationSystemA(); 57 security= SecuritySystemB(); 58 netbank= NetBankSystemC(); 59 } 60 61 Buy() 62 63 auth.MethodA();身份认证子系统 64 security.MethodB();系统安全子系统 65 netbank.MethodC();网银安全子系统 66 67 Console.WriteLine(我已经成功购买了!68 69 } 70 }
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |