目录
编辑
1. 什么是外观模式
1.1外观模式的结构:
2实际案例:
3下面是面试中关于装饰器模式的常见的问题:
3.1下面是问题的答案:
1. 什么是外观模式
Facade模式也叫外观模式, Facade模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作facade。其实也就是提供一个统一的接口,来访问子系统中一群功能相关接口。外观模式定义了一个高层接口,让子系统更容易使用。
外观模式通过定义一个高层接口,来统一封装一系列底层子系统的接口,从而降低了系统的复杂性,并提高了系统的可维护性和可扩展性。
在C++中,外观模式通常由一个Facade类来实现。这个类包含了一系列高层接口,用于封装子系统中的底层接口。客户端可以通过Facade类来使用这些高层接口,而无需了解底层子系统的实现细节。在实现外观模式时,我们通常还需要定义一些底层子系统的类,这些类提供了具体的实现细节。在Facade类中,我们会将这些底层子系统的对象组合起来,并对外提供高层接口。
外观模式的实际应用场景非常广泛,比如说,我们可以使用外观模式来简化复杂的API,隐藏一些不必要的接口,提供更加友好的界面;还可以使用外观模式来封装底层子系统的实现细节,从而实现系统的解耦和高内聚;另外,外观模式还可以用来简化多个类之间的交互,从而减少系统中的复杂度。
1.1外观模式的结构:
-
Facade:为调用方定义简单的调用接口。
-
Clients: 调用者。通过Facade接口调用提供某功能的内部类群。
-
Packages :功能提供者。指提供功能的类群(模块或子系统)
2实际案例:
下面是一个简单的外观模式示例,假设我们有一个子系统包含了两个类:类A和类B,它们分别提供了接口a()和接口b()。客户端想要使用这两个接口,但是不想了解它们的实现细节,这时候可以使用外观模式来简化客户端代码:
#include <iostream>
// 定义类A,提供接口a()
class A {
public:
void a() {
std::cout << "A::a()" << std::endl;
}
};
// 定义类B,提供接口b()
class B {
public:
void b() {
std::cout << "B::b()" << std::endl;
}
};
// 定义外观类Facade,封装类A和类B的接口
class Facade {
public:
Facade() {
// 在构造函数中创建类A和类B的对象
m_A = new A();
m_B = new B();
}
~Facade() {
// 在析构函数中释放类A和类B的对象
delete m_A;
delete m_B;
}
// 提供高层接口,调用类A和类B的接口
void highLevelApi() {
m_A->a();
m_B->b();
}
private:
A* m_A;
B* m_B;
};
int main() {
// 客户端使用外观类
Facade facade;
facade.highLevelApi();
return 0;
}
在这个示例中,类A和类B提供了各自的接口,而外观类Facade封装了它们的接口。在客户端中,只需要创建一个外观类的对象,然后调用外观类的高层接口即可。客户端不需要了解类A和类B的实现细节,也不需要关心它们之间的交互方式,因为这些细节都被封装在Facade类中。
3下面是面试中关于装饰器模式的常见的问题:
- 什么是外观模式?
- 外观模式的主要目的是什么?
- 外观模式与其他模式的区别是什么?
- 外观模式的优缺点是什么?
- 你能否举一个实际应用场景来说明外观模式的使用?
可以尝试自己思考一下,你的看法是什么,然后再看看答案,对比一下,看看有什么遗漏的地方=v=.
3.1下面是问题的答案:
- 外观模式是一种结构型设计模式,它通过为子系统中的一组接口提供一个统一的接口,来简化客户端与子系统之间的交互。外观模式将客户端与复杂的子系统分离开来,使得客户端不必了解子系统的内部实现细节。
- 外观模式的主要目的是简化复杂系统的接口,减少客户端与子系统之间的耦合。外观模式通过为子系统提供一个统一的接口,使得客户端可以更容易地使用子系统,同时也使得子系统更容易被维护和扩展。
- 外观模式与其他模式的区别在于它关注的是接口的简化和统一,而不是对象的创建和组合。外观模式通常涉及到的类只有一个,即外观类,而其他模式可能会涉及到多个类和对象。
- 外观模式的优点包括:
- 简化客户端与子系统之间的交互,降低了客户端代码的复杂度和耦合度。
- 提高了系统的可维护性和可扩展性,因为外观类作为一个中介层,可以隔离子系统的变化对客户端的影响。
- 提高了系统的安全性,因为客户端无法直接访问子系统的内部接口,从而减少了潜在的安全风险。 外观模式的缺点包括:
- 如果子系统的接口发生了变化,外观类也需要进行相应的修改。
- 外观类的引入会增加系统中的一个间接层,有可能会影响到系统的性能和扩展性。
- 一个实际应用场景是在操作系统中,为了方便用户使用,通常会提供一组系统调用接口。这些接口涉及到许多复杂的操作,如文件系统操作、网络连接操作、进程管理等。为了简化用户的操作,操作系统通常会对这些接口进行封装,提供一个统一的接口,供用户使用。
欢迎大家讨论留言,批评指正,共同学习,共同进步!