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

套路
- 外观角色 (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的更多相关文章
- C#设计模式——外观模式(Facade Pattern)
一.概述 在系统设计中,某一个系统可能非常庞大,用户要使用该系统就不得不掌握大量的接口,造成使用的不便.这时可以考虑将该系统细分成一系列子系统并使子系统间的耦合降到最低,利用外观模式提供一个外观对象, ...
- 乐在其中设计模式(C#) - 外观模式(Facade Pattern)
原文:乐在其中设计模式(C#) - 外观模式(Facade Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 外观模式(Facade Pattern) 作者:webabcd 介绍 ...
- 设计模式系列之外观模式(Facade Pattern)——提供统一的入口
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 二十四种设计模式:外观模式(Facade Pattern)
外观模式(Facade Pattern) 介绍为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用.示例有一个Message实体类,某对象对它 ...
- 使用C# (.NET Core) 实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)
本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...
- 设计模式-外观模式(Facade)
简介 外观模式(Facade),将外部与内部子系统的通信通过一个统一的门面对象进行. 由两部分组成: 门面角色:供外部调用,内部可能组装了多个子系统,多个方法. 子系统角色:子系统的方法也可以直接供外 ...
- 设计模式(八): 从“小弟”中来类比"外观模式"(Facade Pattern)
在此先容我拿“小弟”这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿“小弟”来类比“外观模式”.在上面一篇博文我们完整的介绍了“适配器模式”,接下来我们将要在这篇博客 ...
- python : 设计模式之外观模式(Facade Pattern)
#为啥要用外观模式举例说明 这个例子很形象,直接从人家博客上贴过来的,参考链接在下面 不知道大家有没有比较过自己泡茶和去茶馆喝茶的区别,如果是自己泡茶需要自行准备茶叶.茶具和开水,如图1(A)所示,而 ...
- 外观模式Facade pattern
http://www.runoob.com/design-pattern/facade-pattern.html 外观模式 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一 ...
随机推荐
- Tensorflow之TFRecord的原理和使用心得
本文首发于微信公众号「对白的算法屋」 大家好,我是对白. 目前,越来越多的互联网公司内部都有自己的一套框架去训练模型,而模型训练时需要的数据则都保存在分布式文件系统(HDFS)上.Hive作为构建在H ...
- UNION / UNION ALL 区别
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 使用union all: select top 5 ...
- Linux内核学习之2号进程kthreadd
Author : Toney Email : vip_13031075266@163.com Date : 2020.12.04 Copyright : ...
- squid缓存代理
目录: 一.Squid 代理服务器 二.Squid 代理安装 三.搭建传统代理 四.搭建透明代理 五.ACL访问控制 六.Squid日志分析 七.反向代理 一.Squid 代理服务器Squid 主要提 ...
- WPF 通过进程实现异常隔离的客户端
当 WPF 客户端需要实现插件系统的时候,一般可以基于容器或者进程来实现.如果需要对外部插件实现异常隔离,那么只能使用子进程来加载插件,这样插件如果抛出异常,也不会影响到主进程.WPF 元素无法跨进程 ...
- Django学习day12随堂笔记
每日测验 """ 1.什么是cookie和session,你能描述一下它们的由来和工作机制吗(切勿糊弄,敷衍了事) 2.django中如何操作cookie和session ...
- Java基础系列(5)- 使用IDEA开发
IDEA开发 下载安装IDEA https://www.cnblogs.com/gltou/p/14956060.html 使用IDEA编写helloworld 踩坑总结 run的时候提示" ...
- (原创)一步步优化业务代码之——从数据库获取DataTable并绑定到List<Class>
一,前言 现实业务当中,有一个很常见的流程:从数据库获取数据到DataTable,然后将DataTable绑定到实体类集合上,一般是List<Class>,代码写起来也简单:遍历+赋值就可 ...
- HCNP Routing&Switching之路由控制-策略路由
前文我们了解了路由策略工具Route-Policy相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15322135.html:今天我们来聊一聊策略路由相 ...
- windows10 安装配置 jmeter 自动化接口测试 邮件报告
1.安装依赖包:JDK(版本:jdk-7u17-windows-x64) 双击即可安装,注意:jdk不要安装中文路径下,jdk和jre安装在同一路径下 1.1:配置jdk环境变量 (1)JAVA_HO ...