编程模式 - Facade - MetaTrader 5 库


/********************************************************************
编程模式 - Facade
为子系统中的一组接口提供统一的接口。外观定义了更高的
使子系统更易于使用的级别接口。
/**/ /********************************************************************/ 班级子系统A {民众:空白操作A() {打印(“子系统A”);}};/**/ 班级子系统B {民众:空白操作B() {打印(“子系统B”);}};/**/ 班级子系统C {民众:空白操作C() {打印(“子系统C”);}};/********************************************************************/ 班级门面 {民众: 空白 操作AB() {subSystemA.OperationA(); subSystemB.OperationB();} 空白 OperationBC() {subSystemB.OperationB(); subSystemC.OperationC();}受保护的: 子系统A 子系统A; 子系统B 子系统B; 子系统C 子系统C; };
/********************************************************************
适用性
使用 Facade 模式时
*您想为复杂的子系统提供一个简单的接口。子系统
随着它们的发展,它们往往会变得更加复杂。大多数模式在应用时都会导致
更多和更小的班级。这使得子系统更具可重用性并且更容易
定制,但对于不需要的客户来说也变得更难使用
定制它。外观可以提供子系统的简单默认视图
对于大多数客户来说已经足够好了。只有需要更多可定制性的客户才会
需要超越表面。
*客户端和实现类之间有很多依赖关系
一个抽象。引入外观来将子系统与客户端解耦
其他子系统,从而促进子系统的独立性和可移植性。
*您想要对子系统进行分层。使用外观来定义每个的入口点
子系统级别。如果子系统是相关的,那么您可以简化
通过使它们相互通信来实现它们之间的依赖关系
仅通过他们的外墙。
参加者
*外墙
*知道哪些子系统类负责请求。
*将客户端请求委托给适当的子系统对象。
*子系统类
*实现子系统功能。
*处理Facade对象分配的工作。
*对门面一无所知;也就是说,他们没有保留任何引用。
合作
*客户端通过向Facade发送请求与子系统进行通信,Facade
将它们转发到适当的子系统对象。虽然子系统
对象执行实际工作,外观可能必须自己完成工作
将其接口转换为子系统接口。
*使用外观的客户端不必直接访问其子系统对象。
后果
Facade 模式具有以下优点:
1.它将客户端与子系统组件屏蔽开来,从而减少了子系统组件的数量
客户端处理的对象并使子系统更易于使用。
2.它促进了子系统与其客户端之间的弱耦合。
子系统中的组件通常是强耦合的。弱耦合让你可以有所不同
子系统的组件而不影响其客户端。 Facades 帮助层
系统和对象之间的依赖关系。他们可以消除复杂或
循环依赖。当客户
各子系统独立实现。
减少编译依赖性对于大型软件系统至关重要。你想要
当子系统类发生变化时,通过最小化重新编译来节省时间。 减少与外观的编译依赖关系可以限制重新编译
需要对重要子系统进行小的更改。立面也可以简化
将系统移植到其他平台,因为构建一个系统的可能性较小
子系统需要构建所有其他子系统。
3. 它不会阻止应用程序在需要时使用子系统类。
因此,您可以在易用性和通用性之间进行选择。
相关模式
*Abstract Factory可以与Facade结合使用,提供创建的接口
子系统对象以独立于子系统的方式。也可以使用抽象工厂
作为 Facade 的替代方案来隐藏特定于平台的类。
*Mediator 与 Facade 类似,它抽象了现有类的功能。
然而,Mediator 的目的是抽象同事之间的任意通信
对象,通常集中不属于其中任何一个对象的功能。一个
调解员的同事了解并与调解员沟通,而不是
彼此直接沟通。相比之下,立面仅仅抽象了
子系统对象的接口,使它们更易于使用;它没有定义新的
功能,而子系统类不知道它。
通常只需要一个 Facade 对象。因此 Facade 对象通常是 Singletons
/**/ /******************************************************************** Facade 模式的使用示例。客户。 /********************************************************************/ 空白 启动时() { 立面立面; 门面.OperationAB(); {细绳s;为了(整数我=0;我<11; i++) {s+=“-”;}打印(s);} 门面.OperationBC(); }/******************************************************************** 输出: 子系统A 子系统B ------------ 子系统B 子系统C /**/
附件下载
📎 facade.mq5 (0.54 KB)
📎 facade.mqh (10.21 KB)
Source: MQL5 #29802
💡 精彩内容推荐
✍️ 楼主最新发布
- •
- •
- •
- •
- •
- •
🔗 您可能感兴趣
- •
- •
- •
- •
- •
- •
🔐
请登录后参与评论
注册满12小时后评论,即可解锁附件下载
立即登录
