• UE4 C++设计模式:外观模式(Facade Pattern)


    目录

    描述

    套路

    使用场景

    优缺点

    UE4实践

    创建子系统角色类-镜头序列轨道、特效、音频

    创建外观角色类


    描述

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

    外观模式又称门面模式,它是一种对象结构型模式。

    套路

    • 外观角色(Facade)
      • 在客户端可以调用这个角色的方法,在外观角色中可以知道相关子系统的功能和责任;
      • 在正常情况下,它将所有从客户端发来的请求委派到相应的子系统中去
    • 子系统角色(SubSystem)
      • 在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;
      • 子系统并不知道外观(门面)的存在,对于子系统,外观角色仅仅是另一个客户端而已

    使用场景

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

    优缺点

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

    UE4实践

    其实UE4有很多外观模式的影子,例如UKismet库,很多都是继承封装好的,用户可以轻易调用

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

    创建子系统角色类-镜头序列轨道、特效、音频

    1. UCLASS() // 镜头序列轨道管理系统
    2. class DESIGNPATTERNS_API UCameraSubSystem : public UObject
    3. {
    4. GENERATED_BODY()
    5. public:
    6. void Play() {
    7. UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" Camera start moving."));
    8. }
    9. void Stop() {
    10. UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" Camera stop moving."));
    11. }
    12. };
    1. UCLASS() // 特效管理系统
    2. class DESIGNPATTERNS_API UVFXSubsystem : public UObject
    3. {
    4. GENERATED_BODY()
    5. public:
    6. void Play() {
    7. UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" VFX start playing."));
    8. }
    9. void Stop() {
    10. UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" VFX stop playing."));
    11. }
    12. };
    1. UCLASS() // 音频管理系统
    2. class DESIGNPATTERNS_API USFXSubsystem : public UObject
    3. {
    4. GENERATED_BODY()
    5. public:
    6. void Play() {
    7. UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" SFX start playing."));
    8. }
    9. void Stop() {
    10. UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" SFX stop playing."));
    11. }
    12. };

    创建外观角色类

    1. UCLASS()
    2. class DESIGNPATTERNS_API UFacadeObject : public UObject
    3. {
    4. GENERATED_BODY()
    5. public:
    6. UFacadeObject(){
    7. CameraSubSystem = NewObject();
    8. VFXSubsystem = NewObject();
    9. SFXSubsystem = NewObject();
    10. }
    11. ~UFacadeObject(){}
    12. // 开始过场剧场
    13. void PlayCutscene() {
    14. CameraSubSystem->Play();
    15. VFXSubsystem->Play();
    16. SFXSubsystem->Play();
    17. }
    18. // 结束过场剧场
    19. void StopCutscene() {
    20. CameraSubSystem->Stop();
    21. VFXSubsystem->Stop();
    22. SFXSubsystem->Stop();
    23. }
    24. private:
    25. UPROPERTY()
    26. UCameraSubSystem* CameraSubSystem;
    27. UPROPERTY()
    28. UVFXSubsystem* VFXSubsystem;
    29. UPROPERTY()
    30. USFXSubsystem* SFXSubsystem;
    31. };

    测试

    1. UCLASS()
    2. class DESIGNPATTERNS_API AFacadeTestActor : public AActor
    3. {
    4. GENERATED_BODY()
    5. public:
    6. AFacadeTestActor();
    7. virtual void Tick(float DeltaTime) override;
    8. UPROPERTY()
    9. UFacadeObject* FacadeObject;
    10. protected:
    11. // Called when the game starts or when spawned
    12. virtual void BeginPlay() override {
    13. FacadeObject = NewObject();
    14. // 播放过场剧情
    15. FacadeObject->PlayCutscene();
    16. UE_LOG(LogTemp, Warning, TEXT(" ---------------------------------------------- "));
    17. // 结束或跳过过场剧情
    18. FacadeObject->StopCutscene();
    19. }
    20. };
    1. LogTemp: Warning: UCameraSubSystem::Play Camera start moving.
    2. LogTemp: Warning: UVFXSubsystem::Play VFX start playing.
    3. LogTemp: Warning: USFXSubsystem::Play SFX start playing.
    4. LogTemp: Warning: ----------------------------------------------
    5. LogTemp: Warning: UCameraSubSystem::Stop Camera stop moving.
    6. LogTemp: Warning: UVFXSubsystem::Stop VFX stop playing.
    7. LogTemp: Warning: USFXSubsystem::Stop SFX stop playing.

     

  • 相关阅读:
    智慧导览|智能导游系统|AR景区导览系统|景区电子导览
    FCPX教程|如何在Final Cut Pro 的时间线中调整转场?
    SpringBoot健身房教练课程预约管理系统java
    JVM——4.垃圾回收
    【HTML】交友软件上照片的遮罩是如何做的
    B站每日自动签到&传统单节点网站的 Serverless 上云
    如何把项目部署到云服务器
    【后端面经-数据库】MySQL的存储引擎简介
    Cell和RefCell
    讲述CBO And Database Statistics
  • 原文地址:https://blog.csdn.net/Jason6620/article/details/126539529