码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【23种设计模式】外观模式(十)


    合集 - 23种设计模式(11)
    1.【23种设计模式】设计模式综述(开篇)08-262.【23种设计模式】单例模式(一)08-263.【23种设计模式】工厂方法模式(二)08-274.【23种设计模式】抽象工厂模式(三)08-295.【23种设计模式】建造者模式(四)08-296.【23种设计模式】原型模式(五)08-317.【23种设计模式】适配器模式(六)09-018.【23种设计模式】桥接模式(七)09-059.【23种设计模式】组合模式(八)09-1110.【23种设计模式】装饰模式(九)09-12
    11.【23种设计模式】外观模式(十)09-26
    收起

    前言

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

    外观模式的定义

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

    image

    外观模式的组成

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

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

    外观模式的代码实现

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

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

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

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

    image

    外观模式的优缺点

    优点
    • 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
    • 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。
    缺点
    • 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了"开闭原则"。
  • 相关阅读:
    Windows CSC服务特权提升漏洞(CVE-2024-26229)
    【面试专栏】java线程第一篇:Java线程、线程状态、线程方法
    popcount相关性质+从低往高的数位dp:CF1734F
    力扣hot100:146. LRU 缓存
    【Linux】从零开始学习Linux基本指令(三)
    设计模式总结-适配器模式
    博弈论 1.Introduction(组合游戏基本概念、对抗搜索、Bash游戏、Nim游戏)
    【Vue】vue2 封装 echarts 基础组件,直接传 option 即可
    华为机试真题 Java 实现【日志首次上报最多积分】【2022.11 Q4 新题】
    java的Excel导出方式总结
  • 原文地址:https://www.cnblogs.com/wml-it/p/17730188.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号