门面模式(Facade Pattern):互相关联的复杂类,统一整合出对外部暴露可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
介绍
- 意图:为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口。
- 主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。
- 何时使用:
1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个”接待员”即可。
2、定义系统的入口。
- 优点:
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
- 缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
- 使用场景:
1、为复杂的模块或子系统提供外界访问的模块。
2、子系统相对独立。
3、预防低水平人员带来的风险。
注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
示例
Shape.ts 模型接口
1 2 3
| export interface Shape { draw(): void; }
|
Rectangle.ts 矩形类
1 2 3 4 5 6 7
| import { Shape } from "./Shape";
export default class Rectangle implements Shape { public draw(): void { console.log("Rectangle::draw()"); } }
|
Square.ts 正方形类
1 2 3 4 5 6 7 8
| import { Shape } from "./Shape";
export default class Square implements Shape {
public draw(): void { console.log("Square::draw()"); } }
|
Circle.ts 圆形类
1 2 3 4 5 6 7 8
| import { Shape } from "./Shape";
export default class Circle implements Shape {
public draw(): void { console.log("Circle::draw()"); } }
|
ShapeMaker.ts 图形绘制门面类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| import { Shape } from "./Shape"; import Circle from "./Circle"; import Rectangle from "./Rectangle"; import Square from "./Square";
export default class ShapeMaker { private circle: Shape; private rectangle: Shape; private square: Shape;
constructor() { this.circle = new Circle(); this.rectangle = new Rectangle(); this.square = new Square(); }
public drawCircle(): void {//绘制圆形 this.circle.draw(); } public drawRectangle(): void {//绘制矩形 this.rectangle.draw(); } public drawSquare(): void {//绘制正方形 this.square.draw(); } }
|
index.ts
1 2 3 4 5 6 7
| import ShapeMaker from "./ShapeMaker";
const shapeMaker: ShapeMaker = new ShapeMaker();
shapeMaker.drawCircle(); shapeMaker.drawRectangle(); shapeMaker.drawSquare();
|
result
1 2 3
| Circle::draw() Rectangle::draw() Square::draw()
|
类图
角色
- Facade (门面)
Facde角色向系统外部提供统一接口。示例中ShapeMaker类扮演该角色
- 其他角色
Facade角色调用这些角色进行工作,但是其他角色各自完成自己的工作,并不知道Facade角色,示例中的Circle、Rectangle、Square扮演该角色
- Client(请求角色)
负责调用Facade角色,并不包括在Facade模式中