概述

描述

  • 外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。

套路

  • 外观角色 (Facade)

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

    在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;子系统并不知道外观(又称为门面)的存在,对于子系统而言,外观角色仅仅是另一个客户端而已。

使用场景

  • 想要为访问一系列复杂的子系统提供一个统一的简单入口
  • 客户端与多个子系统之间存在很大的依赖性,引入外观类可以将子系统和客户端解耦
  • 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系

优缺点

  • 优点

    • 降低了客户类与子系统类的耦合度,实现了子系统与客户之间的松耦合关系
    • 外观模式对客户屏蔽了子系统组件,从而简化了接口,减少了客户处理的对象数目并使子系统的使用更加简单。
    • 降低原有系统的复杂度和系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
  • 缺点
    • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
    • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。

UE4 实践

  • 其实UE4有很多外观模式的影子,例如常调用的UKisme库t,很多都是集成封装好的,用户可以轻易调用

  • 实现一个剧情过场的案例雏形

  • 创建子系统角色类 —— 镜头序列轨道管理系统、特效管理系统、音频管理系统

    UCLASS() // 镜头序列轨道管理系统
    class DESIGNPATTERNS_API UCameraSubSystem : public UObject
    {
    GENERATED_BODY()
    public:
    void Play() {
    UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" Camera start moving."));
    } void Stop() {
    UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" Camera stop moving."));
    }
    }; UCLASS() // 特效管理系统
    class DESIGNPATTERNS_API UVFXSubsystem : public UObject
    {
    GENERATED_BODY()
    public:
    void Play() {
    UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" VFX start playing."));
    } void Stop() {
    UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" VFX stop playing."));
    }
    }; UCLASS() // 音频管理系统
    class DESIGNPATTERNS_API USFXSubsystem : public UObject
    {
    GENERATED_BODY()
    public:
    void Play() {
    UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" SFX start playing."));
    } void Stop() {
    UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" SFX stop playing."));
    }
    };
  • 创建外观角色类

    UCLASS()
    class DESIGNPATTERNS_API UFacadeObject : public UObject
    {
    GENERATED_BODY()
    public:
    UFacadeObject(){
    CameraSubSystem = NewObject<UCameraSubSystem>();
    VFXSubsystem = NewObject<UVFXSubsystem>();
    SFXSubsystem = NewObject<USFXSubsystem>();
    }
    ~UFacadeObject(){} // 开始过场剧场
    void PlayCutscene() {
    CameraSubSystem->Play();
    VFXSubsystem->Play();
    SFXSubsystem->Play();
    } // 结束过场剧场
    void StopCutscene() {
    CameraSubSystem->Stop();
    VFXSubsystem->Stop();
    SFXSubsystem->Stop();
    } private:
    UPROPERTY()
    UCameraSubSystem* CameraSubSystem; UPROPERTY()
    UVFXSubsystem* VFXSubsystem; UPROPERTY()
    USFXSubsystem* SFXSubsystem;
    };
  • 调用测试

    UCLASS()
    class DESIGNPATTERNS_API AFacadeTestActor : public AActor
    {
    GENERATED_BODY() public:
    AFacadeTestActor();
    virtual void Tick(float DeltaTime) override; UPROPERTY()
    UFacadeObject* FacadeObject; protected:
    // Called when the game starts or when spawned
    virtual void BeginPlay() override {
    FacadeObject = NewObject<UFacadeObject>(); // 播放过场剧情
    FacadeObject->PlayCutscene(); UE_LOG(LogTemp, Warning, TEXT(" ---------------------------------------------- ")); // 结束或跳过过场剧情
    FacadeObject->StopCutscene();
    }
    };
  • 调式输出

    LogTemp: Warning: UCameraSubSystem::Play Camera start moving.
    LogTemp: Warning: UVFXSubsystem::Play VFX start playing.
    LogTemp: Warning: USFXSubsystem::Play SFX start playing.
    LogTemp: Warning: ----------------------------------------------
    LogTemp: Warning: UCameraSubSystem::Stop Camera stop moving.
    LogTemp: Warning: UVFXSubsystem::Stop VFX stop playing.
    LogTemp: Warning: USFXSubsystem::Stop SFX stop playing.

参考

【UE4 设计模式】外观模式 Facade Pattern的更多相关文章

  1. C#设计模式——外观模式(Facade Pattern)

    一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...

  2. 乐在其中设计模式(C#) - 外观模式(Facade Pattern)

    原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...

  3. 设计模式系列之外观模式(Facade Pattern)——提供统一的入口

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  4. 二十四种设计模式:外观模式(Facade Pattern)

    外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...

  5. 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...

  6. 设计模式-外观模式(Facade)

    简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...

  7. 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)

    在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...

  8. python : 设计模式之外观模式(Facade Pattern)

    #为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...

  9. 外观模式Facade pattern

    http://www.runoob.com/design-pattern/facade-pattern.html 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一 ...

随机推荐

  1. Python脚本导出AWS EC2资源清单

    环境需求 单位现在每隔一段时间需要核对一下 AWS 正在运行的 EC2 资源清单,为了避免核对失误以及重复性的工作,打算用脚本来解决这一重复性的工作.大概思路为 通过 AWS AK.SK 来索取 AW ...

  2. C#多线程开发-任务并行库04

    你好,我是阿辉. 之前学习了线程池,知道了它有很多好处. 使用线程池可以使我们在减少并行度花销时节省操作系统资源.可认为线程池是一个抽象层,其向程序员隐藏了使用线程的细节,使我们可以专心处理程序逻辑, ...

  3. stat 命令家族(4)- 详解 iostat

    性能测试必备的 Linux 命令系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1819490.html 介绍 报告 CPU 信息和 I/ ...

  4. 将两个byte型拼接成16位二进制,再转化为十进制

    short s = 0; //一个16位整形变量,初值为 0000 0000 0000 0000 byte b1 = 1; //一个byte的变量,作为转换后的高8位,假设初值为 0000 0001 ...

  5. Identity用户管理入门七(扩展用户字段)

    在实际使用时会发现很多字段在IdentityUser中并不存在,比如增加生日,地址等字段,可在模型类中实现自己的模型并继承自IdentityUser,需要修改的代码为以下类 一.新增模型 using ...

  6. try catch处理流的异常

    1.try catch处理异常 try{} catch(Exception e){} finally{ 必然执行的代码,一般是释放资源 } 2.流使用try catch处理异常 其中,变量作用域只在当 ...

  7. java中链表和数组的区别?

    综述:数组是线性结构,可以直接索引,即要去第i个元素,a[i]即可.链表也是线性结构,要取第i个元素,只需用指针往后遍历i次就可.貌似链表比数组还要麻烦些,而且效率低些. 想到这些相同处中的一些细微的 ...

  8. PHP中的MySQLi扩展学习(五)MySQLI_STMT对象操作

    就像 PDO 中的 PDO_Statment 对象一样,MySQLI_STMT 对象也是一个预处理语句所形成的对象,专门用来操作 MySQLi 所生成的预处理语句的.其实操作方式之类也都比较相似,不外 ...

  9. Docker系列(8)- 常用其他命令(1) | 日志、元数据、进程的查看

    后台启动容器 # 命令 docker run -d 镜像名 [root@localhost ~]# docker run -d centos #问题:docker ps,发现centos停止了 #常见 ...

  10. Dapr + .NET Core实战(四)发布和订阅

    什么是发布-订阅 发布订阅是一种众所周知并被广泛使用的消息传送模式,常用在微服务架构的服务间通信,高并发削峰等情况.但是不同的消息中间件之间存在细微的差异,项目使用不同的产品需要实现不同的实现类,虽然 ...