【23种设计模式】外观模式(十)

  • 【23种设计模式】外观模式(十)已关闭评论
  • 120 次浏览
  • A+
所属分类:.NET技术
摘要

外观模式,英文名称是:Facade Pattern。我们先从名字上来理解一下“外观模式”。我看到了“外观”这个词语,就想到了“外表”这个词语,两者有着很相近的意思。就拿谈恋爱来说,“外表”很重要,如果第一眼看着很舒服、有眼缘,那就有交往下去的可能。如果长的“三寸钉、枯树皮”,估计就够呛了。在这方面,“外观”和“外表”有着相同的作用。在软件系统中,要完成一个功能,需要很多接口调用,不仅增加了开发难度,也增加了调试成本和维护的复杂度。不如我们把这些接口再封装一次,给一个很好的“外观”,让使用者使用更方便,只需调用一个接口,就可以完成以前调用多个接口的来完成任务。这个模式很简单,大家很容易理解,可能大家在编码的过程中已经不止一次使用过该模式了,只是不知道名字罢了。


前言

外观模式,英文名称是:Facade Pattern。我们先从名字上来理解一下“外观模式”。我看到了“外观”这个词语,就想到了“外表”这个词语,两者有着很相近的意思。就拿谈恋爱来说,“外表”很重要,如果第一眼看着很舒服、有眼缘,那就有交往下去的可能。如果长的“三寸钉、枯树皮”,估计就够呛了。在这方面,“外观”和“外表”有着相同的作用。在软件系统中,要完成一个功能,需要很多接口调用,不仅增加了开发难度,也增加了调试成本和维护的复杂度。不如我们把这些接口再封装一次,给一个很好的“外观”,让使用者使用更方便,只需调用一个接口,就可以完成以前调用多个接口的来完成任务。这个模式很简单,大家很容易理解,可能大家在编码的过程中已经不止一次使用过该模式了,只是不知道名字罢了。

外观模式的定义

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。  

【23种设计模式】外观模式(十)

外观模式的组成

  • 外观角色(Facade):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。

  • 子系统角色(SubSystem):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已

外观模式的代码实现

马上就到“双十一”了,人们又开始疯狂的购买了。其实购买的过程很复杂,但是我们在购买的过程只需要选择自己喜欢的商品,也可以加入购物车,最后点击付款就完成了。其实这个过程没有那么简单。我们下面就模仿一下购买的过程吧。

购买过程有几点必须要做的事情:

1、身份验证安全,没有认证是无效用户。
2、系统安全,检查系统环境,防止注入、跨站和伪造等攻击
3、网银安全,检查付款地址的有效性,检查网关是否正常

安全子系统定义
 /// <summary>     /// 身份认证子系统A     /// </summary>     public class AuthoriationSystemA     {         public void MethodA()         {             Console.WriteLine("执行身份认证");         }     }  /// <summary>     /// 系统安全子系统B     /// </summary>     public class SecuritySystemB     {         public void MethodB()         {             Console.WriteLine("执行系统安全检查");         }     } /// <summary>     /// 网银安全子系统C     /// </summary>     public class NetBankSystemC     {         public void MethodC()         {             Console.WriteLine("执行网银安全检测");         }     } 
高层Facade
 /// <summary>     /// 高层的Facade     /// </summary>     public class SystemFacade     {         private AuthoriationSystemA auth;         private SecuritySystemB security;         private NetBankSystemC netbank;          public SystemFacade()         {             auth = new AuthoriationSystemA();             security = new SecuritySystemB();             netbank = new NetBankSystemC();         }          public void Buy()         {             auth.MethodA();//身份认证子系统             security.MethodB();//系统安全子系统             netbank.MethodC();//网银安全子系统              Console.WriteLine("我已经成功购买了!");         }     } 
调用
 /// <summary>     /// FacadeTest 测试类     /// </summary>     public class FacadeTest : ITest     {         public void RunTest()         {             SystemFacade facade = new SystemFacade();             facade.Buy();         }     } 

【23种设计模式】外观模式(十)

外观模式的优缺点

优点
  • 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
  • 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户
缺点
  • 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了"开闭原则"