11.设计模式_外观模式

Carlos Carlos     2022-09-15     370

关键词:

一、引言

在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“模式。下面就具体介绍下外观模式。

二、外观模式的详细介绍

2.1 定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。

2.2 外观模式实现

介绍了外观模式的定义之后,让我们具体看看外观模式的由来以及实现,下面与学校中一个选课系统为例来解释外观模式,例如在选课系统中,有注册课程子系统和通知子系统,在不使用外观模式的情况下,客户端必须同时保存注册课程子系统和通知子系统两个引用,如果后期这两个子系统发生改变时,此时客户端的调用代码也要随之改变,这样就没有很好的可扩展性,下面看看不使用外观模式下选课系统的实现方式和客户端调用代码:

/// <summary>
    /// 不使用外观模式的情况
    /// 此时客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统
    /// 为了解决这样的问题,我们可以使用外观模式来为所有子系统设计一个统一的接口
    /// 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作
    /// 从而让客户和子系统之间避免了紧耦合
    /// </summary>
    class Client
    {
        static void Main(string[] args)
        {
            SubSystemA a = new SubSystemA();
            SubSystemB b = new SubSystemB();
            SubSystemC c = new SubSystemC();
            a.MethodA();
            b.MethodB();
            c.MethodC();
            Console.Read();
        }
    }

    // 子系统A
    public class SubSystemA
    {
        public void MethodA()
        {
            Console.WriteLine("执行子系统A中的方法A");
        }
    }

    // 子系统B
    public class SubSystemB
    {
        public void MethodB()
        {
            Console.WriteLine("执行子系统B中的方法B");
        }
    }

    // 子系统C
    public class SubSystemC
    {
        public void MethodC()
        {
            Console.WriteLine("执行子系统C中的方法C");
        }
    }

然而外观模式可以解决我们上面所说的问题,下面具体看看使用外观模式的实现:

/// <summary>
    /// 以学生选课系统为例子演示外观模式的使用
    /// 学生选课模块包括功能有:
    /// 验证选课的人数是否已满
    /// 通知用户课程选择成功与否
    /// 客户端代码
    /// </summary>
    class Student
    {
        private static RegistrationFacade facade = new RegistrationFacade();

        static void Main(string[] args)
        {
            if (facade.RegisterCourse("设计模式", "Learning Hard"))
            {
                Console.WriteLine("选课成功");
            }
            else
            {
                Console.WriteLine("选课失败");
            }

            Console.Read();
        }
    }

    // 外观类
    public class RegistrationFacade
    {
        private RegisterCourse registerCourse;
        private NotifyStudent notifyStu;
        public RegistrationFacade()
        {
            registerCourse = new RegisterCourse();
            notifyStu = new NotifyStudent();
        }

        public bool RegisterCourse(string courseName, string studentName)
        {
            if (!registerCourse.CheckAvailable(courseName))
            {
                return false;
            }

            return notifyStu.Notify(studentName);
        }
    }

    #region 子系统
    // 相当于子系统A
    public class RegisterCourse
    {
        public bool CheckAvailable(string courseName)
        {
            Console.WriteLine("正在验证课程 {0}是否人数已满", courseName);
            return true;
        }
    }

    // 相当于子系统B
    public class NotifyStudent
    {
        public bool Notify(string studentName)
        {
            Console.WriteLine("正在向{0}发生通知", studentName);
            return true;
        }
    }
    #endregion

使用了外观模式之后,客户端只依赖与外观类,从而将客户端与子系统的依赖解耦了,如果子系统发生改变,此时客户端的代码并不需要去改变。外观模式的实现核心主要是——由外观类去保存各个子系统的引用,实现由一个统一的外观类去包装多个子系统类,然而客户端只需要引用这个外观类,然后由外观类来调用各个子系统中的方法。然而这样的实现方式非常类似适配器模式,然而外观模式与适配器模式不同的是:适配器模式是将一个对象包装起来以改变其接口,而外观是将一群对象 ”包装“起来以简化其接口。它们的意图是不一样的,适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口

2.3 外观模式的结构

看完外观模式的实现之后,为了帮助理清外观模式中类之间的关系,下面给出上面实现代码中类图:

然而对于外观模式而言,是没有一个一般化的类图描述,下面演示一个外观模式的示意性对象图来加深大家对外观模式的理解:

在上面的对象图中有两个角色:

门面(Facade)角色:客户端调用这个角色的方法。该角色知道相关的一个或多个子系统的功能和责任,该角色会将从客户端发来的请求委派带相应的子系统中去。

子系统(subsystem)角色:可以同时包含一个或多个子系统。每个子系统都不是一个单独的类,而是一个类的集合。每个子系统都可以被客户端直接调用或被门面角色调用。对于子系统而言,门面仅仅是另外一个客户端,子系统并不知道门面的存在。

三、外观的优缺点

优点:

  1. 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
  2. 外观模式实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件是紧耦合的。松耦合使得子系统的组件变化不会影响到它的客户。

缺点:

  1. 如果增加新的子系统可能需要修改外观类或客户端的源代码,这样就违背了”开——闭原则“(不过这点也是不可避免)。

四、使用场景

 在以下情况下可以考虑使用外观模式:

  • 外一个复杂的子系统提供一个简单的接口
  • 提供子系统的独立性
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口。其中三层架构就是这样的一个例子

五、总结

到这里外观模式的介绍就结束了,外观模式,为子系统的一组接口提供一个统一的接口,该模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。并且外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。

 

11.外观模式(代码片段)

外观模式1.影院管理项目2.传统方式解决影院管理3.外观模式基本介绍4.外观模式解决影院管理5.mybatis外观模式设计案例6.外观模式的注意事项1.影院管理项目组建一个家庭影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆... 查看详情

11.外观模式

外观模式:为一组复杂的子系统接口提供一个更高级的统一接口,通过这个接口使得系统接口的访问更容易。在javascript中有时也会用于对底层结构兼容性做统一封装来简化用户使用。11.1添加一个点击事件  1document.onclick=functio... 查看详情

设计模式的征途—11.外观(facade)模式

在软件开发中,有时候为了完成一项较为复杂的功能,一个类需要和多个其他业务类交互,而这些需要交互的业务类经常会作为一个完整的整体出现,由于涉及的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似服... 查看详情

尚硅谷设计模式学习(11)---[外观模式(facade)](代码片段)

...#x1f680;🚀🚀尚硅谷传送门==>B站尚硅谷Java设计模式❤❤❤感谢尚硅谷❤❤❤🕐🕑🕒最近开始计划学习一下设计模式了,加油!!!目录📢情景引入🌈外观模式📢情景引入组建一个家庭影院ÿ... 查看详情

设计模式-结构型模式_外观模式(代码片段)

...桥接、组合、装饰器、外观、享元、代理,这7类概述设计模式是解决程序中不合理、不易于扩展、不易于维护的问题,也是⼲掉⼤部分ifelse的利器,在我们常⽤的框架中基本都会⽤到⼤量的设计模式来构建组件,... 查看详情

外观模式

 1<?php23/**4*门面模式(Facade)又称外观模式,用于为子系统中的一组接口提供一个一致的界面。5*门面模式定义了一个高层接口,这个接口使得子系统更加容易使用:引入门面角色之后,6*用户只需要直接与门面角色交互,... 查看详情

2015-03-12---外观模式,建造者模式(附代码),观察者模式(附代码),boost库应用

...bind,function,regex,thread,unordered,ref,smartpointers库,晚上看了看设计模式。主要就是外观模式。建造者模式和观察者模式。我们从boost简要说起。事实上boost的库好多东西在c++11里面已经有了。比方bind,仅仅只是boost的库的bind比c++11用着... 查看详情

javascript设计模式(代码片段)

JavaScript设计模式设计模式概念经过代码设计经验总结之后设计出的一种固定解决问题的方式设计模式作用代码复用保证代码可靠性将编程工程化更易被他人理解设计模式的分类(W3C平台)构造器模式,模块化模式,暴露模块模式,... 查看详情

设计模式-结构型模式讲解下(装饰者外观代理)(代码片段)

一、结构型设计模式上篇,我们讲解了结构型设计模式的适配器、桥接、组合、享元模式。文章地址:https://blog.csdn.net/qq_43692950/article/details/120248267这篇文章我们讲解下结构型设计模式的装饰者、外观、代理模式。二、装... 查看详情

设计模式---外观模式(代码片段)

外观模式模式动机模式定义模式结构角色模式分析典型的外观角色代码外观模式实例与解析实例一:电源总开关实例二:文件加密模式优缺点优点缺点模式适用环境源码分析外观模式的典型应用(1)外观模式应用于JDBC数据... 查看详情

外观模式(代码片段)

...扩展子系统行为容易引入风险;不符合开闭原则。6.相关设计模式:中介者模式、单例模式、抽象工厂模式。7.实例目录package8.实例UML类图9.代码1packagecom.geely.design.pattern.structural.facade;23publicclassPointsGift4privateStringname;56publicPointsGift... 查看详情

设计模式外观模式

...外观模式(Facadepattern),是软件工程中常用的一种软件设计模式,它为子系统中的一组接口提供一个统一的高层接口,使得子系统更容易使用。相当于将一系列不同的类方法调用,封装到一个新类的方法中。抽象外观模式:在... 查看详情

“headfirst设计模式“:外观模式

外观模式外观模式定义:外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。类图如下:要点:●外观模式为复杂子系统提供了一个简单接口,并不为子系统添加新... 查看详情

外观模式(facadepattern)(代码片段)

外观模式(FacadePattern)1.模式定义外观模式(FacadePattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易... 查看详情

23种设计模式——外观模式接口隔离

外观模式文章目录外观模式意图什么时候使用外观真实世界类比外观模式的实现外观模式的优缺点亦称:Facade意图外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模... 查看详情

设计模式解密-外观模式(门面模式)

1、简介外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接... 查看详情

设计模式外观模式

一、前言  分析完适配器模式后,接着看外观模式,外观模式很简单,可以理解为在复杂系统上封装了一层,提供了统一的接口,而让客户端只需要与该接口通信便可控制背后复杂的系统。二、外观模式定义  定义:提供了... 查看详情

00.设计模式_软件设计的原则

一、设计模式的分类总体来说设计模式分为三大类:创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、... 查看详情