0. 简介
外观模式作为我们常用结构模式的最后一节,一些不常用的比如说桥接、享元、代理等,这里等有时间在补充学习吧。下面我将会来继创建模式和结构模式后来讲行为模式。
外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这些接口使得这一子系统更加容易使用. 其基本的结构体大致如下:
1. 外观模式示意图
Facade类(外观类):对外提供一个高层接口,将客户的请求交给适当子系统进行处理;
SubSystem Classees: 是子系统类的集合,每个子系统都完成一个特定的功能,这些子系统可以是某个模块,也可是某些类,Facade类将用户的请求交给这些子系统进行处理;需要注意的是子类中没有Facade类的任何信息,即没有对Facade类对象的引用;
2. 示例程序
外观函数的示例函数很简单,其实就是对多个函数进行封装调用,其形式和生成器的主管 (Director) 类似。可以通过使用简单接口, 但将绝大部分工作委派给其他类的类来识别。 通常情况下, 外观管理其所使用的对象的完整生命周期。
#include<iostream>
using namespace std;
class Sub_Work1//子工作1
{
public:
void Working1()
{
cout<<"Doing Sub-Work1..."<<endl;
}
};
class Sub_Work2//子工作2
{
public:
void Working2()
{
cout<<"Doing Sub-Work2..."<<endl;
}
};
class Sub_Work3//子工作3
{
public:
void Working3()
{
cout<<"Doing Sub-Work3..."<<endl;
}
};
class Sub_Work4//子工作4
{
public:
void Working4()
{
cout<<"Doing Sub-Work4..."<<endl;
}
};
class Work//总工作,客户与之打交道
{
private:
Sub_Work1 w1;
Sub_Work2 w2;
Sub_Work3 w3;
Sub_Work4 w4;
public:
void Work1()//总工作1
{
w1.Working1();
w3.Working3();
}
void Work2()//总工作2
{
w2.Working2();
w3.Working3();
w4.Working4();
}
};
int main()//client程序
{
Work w;
/*******总工作1******/
cout<<"开始调用总工作1"<<endl;
w.Work1();
/*******总工作2******/
cout<<endl<<"开始调用总工作2"<<endl;
w.Work2();
return 0;
}
3. 外观模式的优缺点
在设计初期阶段,应该有意识的将不同的两个层分离或者系统模块化,比如经典的三层架构,就需要在考虑数据访问层和业务逻辑层、业务逻辑层和表示层的层和层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大降低.
在开发阶,由于子系统的不断重构演变而变的越来越复杂,客户端程序调用子系统变得困难,此时可以引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
在维护一个遗留的大型系统时,可以能这个系统已经非常难以维护和扩展了,但因为包含非常重要的功能,新的需求必须依赖它。此时使用外观模式也是非常适合的。我们为新系统开发一个Facade外观类,让新系统与Facade对象交互,Facade对象与遗留代码交互完成所有复杂的工作。
外观模式为现有对象定义了一个新接口, 适配器模式则会试图运用已有的接口。 适配器通常只封装一个对象, 外观通常会作用于整个对象子系统上。
当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂模式来代替外观。
外观类通常可以转换为单例模式类, 因为在大部分情况下一个外观对象就足够了。
4. 参考链接
https://www.cnblogs.com/wzxNote/p/12718427.html
评论(0)
您还未登录,请登录后发表或查看评论