“鸣人,他还没死了,解决他吧。“卡卡西原著是他来解决的,因为原著来的时候鸣人已经是伤痕累累,使用了螺旋丸手里剑之后更是没力了,因此只有他来代为下手了,但是现在漩涡鸣人却是一点事情也没有,理所当然是交给漩涡鸣人这个角都的对手来做了。

C#设计模式之十一外观模式(Facade)【结构型】


一、引言

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


二、外观模式的详细介绍

2.1、动机(Motivate)

   在软件系统开发的过程中,当组件的客户(即外部接口,或客户程序)和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?如何将外部客户程序的演化和内部子系统的变化之间的依赖相互解耦?

2.2、意图(Intent)

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

2.3、结构图

      

2.4、模式的组成
    
    外观模式包含如下两个角色:

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

      . 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 }


     这个模式很简单,就话不多说了。

三、外观模式的实现要点:
    
    1、一个系统可以有几个门面类

     在门面模式中,通常只需要一个门面类,并且此门面类只有一个实例,换言之它是一个单例类。当然这并不意味着在整个系统里只有一个门面类,而仅仅是说对每一个子系统只有一个门面类。或者说,如果一个系统有好几个子系统的话,每一个子系统都有一个门面类,整个系统可以有数个门面类。

    2、为子系统增加新行为

     初学者往往以为通过继承一个门面类便可在子系统中加入新的行为,这是错误的。门面模式的用意是为子系统提供一个集中化和简化的沟通管道,而不能向子系统加入新的行为。比如医院中的接待员并不是医护人员,接待员并不能为病人提供医疗服务。

    3、Facade有助于建立层次结构的系统,实现了子系统与客户之间的松耦合关系,子系统内部的功能组件往往是紧耦合的。松耦合关系使得子系统的组件变化不会影响到它的客户。Facade消除了复杂的循环依赖关系。这一点在客户程序与子系统分别实现的时候格外重要。

    4、从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Facade接口的变化。

四、.NET 中外观模式的实现

    外观模式在FCL里面运用还是很多的,多数情况是单个类的情况,在Asp.Net里面,有很多复合控件,比如:Login控件,可以登录,可以认证,可以保存登录用户信息。其实,外观模式更多的是应用在业务系统当中,效果更好。

五、总结

  这个模式很简单,就不说了,就稍微做一下小结。Facade设计模式更注重从架构的层次去看整个系统,而不是单个类的层次。Facade很多时候更是一种架构设计模式。注意区分Facade模式、Adapter模式、Bridge模式与Decorator模式:

  Facade模式注重简化接口

  Adapter模式注重转换接口

  Bridge模式注重分离接口(抽象)与其实现

  Decorator模式注重稳定接口的前提下为对象扩展功能

当前文章:http://hnhdqp.com/news/20181076171.html

发布时间:2018-10-17 07:12:09

83楼网赚 租服务器挂机赚钱 业余挣钱小门路 开福利彩票店赚钱吗 如何在网上打字挣钱 在家网上赚钱平台推荐 不需要投资挣钱快的 什么网游好赚钱 阿锐网赚博客分享 在农村开什么厂赚钱

编辑:安徒平开

相关新闻

易烊千玺为演戏熟读《楚辞》 TFBOYS“学霸”秘籍大公开

2018-10-17 01:50:33

曲靖滞胸汽车用品有限公司

将普惠金融践行到底 招财猫理财再度跨界互联网医药

2018-10-17 01:47:03

云浮探屡月通讯股份有限公司

《蒙娜丽莎》眼中藏神秘字符 系达芬奇密码?

2018-10-17 13:26:28

四平咕油科技股份有限公司

加拿大惊现古罗马铜剑:哥伦布第一总被抢欲哭无泪

2018-10-17 10:02:28

黔西南趁评家工贸有限公司

热门推荐

  • 新游早报:真实世界炒房的地产大亨 3D版本的扫雷等
  • GPS定位、拍照存证,中央"钦差"查什么?
  • 【代表委员谈旅游】谌贻琴:用生态之美谋赶超之策造百姓之福
  • 京东笔记本开年盛典:5折限量秒杀
  • 《足球小将》新TV动画2018年4月开播,首部PV公开
  • 什么是算法
  • 财务造假事小,核电才是要了东芝老命的元凶
  • 滨州市6个面粉产品入选“中国好粮油”产品名单
  • 四川九寨沟县发生4.5级地震 震源深度16千米
  • 新款雪铁龙C4 Cactus 或定位紧凑级两厢车
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:包赔付网赚平台 迅雷赚钱宝下载
  • 赚钱的微信群名字 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 电脑赚q币 中华手赚网源码 能挣钱的手游排行榜 挂机赚是真的吗