Zlog
首页时间轴关于
Zlog

一个探索技术、编程和构建 Web 的个人空间。

© 2026 Zlog

导航

首页时间轴关于

链接

首页/Facade

Facade

外观模式:就是提供一个统一的接口去访问多个子系统的多个不同的接口,为子系统中的一组接口提供统一的高层接口。使得子系统更容易使用,不仅简化类中的接口,而且实现调用者和接口的解耦。

Z

Zephyr110

2021年12月26日·2 分钟
|
frontenddesignpattern

1. 简述

1.1 什么是外观模式

外观模式:就是提供一个统一的接口去访问多个子系统的多个不同的接口,为子系统中的一组接口提供统一的高层接口。使得子系统更容易使用,不仅简化类中的接口,而且实现调用者和接口的解耦。

1.2 为什么需要外观模式

外观模式可以让我们间接调用子系统,从而避免因直接访问子系统而产生不必要的错误。

1.3 适用场景

  • JS 中常常用于解决浏览器兼容性问题。

1.4 优缺点

  • 优点: 易于使用,而且本身也比较轻量级。
  • 缺点: 连续使用时会产生一定的性能问题,因为在每次调用时都要检测功能的可用性。

1.5 JS 中实现外观模式

1.5.1 简单示例

js
// a.js
export default {
	getA(params) {
		// do something...
	},
};
 
// b.js
export default {
	getB(params) {
		// do something...
	},
};
 
// app.js  外观模式为子系统提供同一的高层接口
import A from "./a";
import B from "./b";
export default {
	A,
	B,
};
js
// 通过同一接口调用子系统
import app from "./app";
 
app.A.getA(params);
app.B.getB(params);

1.5.2 浏览器兼容

使用外观模式通过检测浏览器特性的方式来创建一个跨浏览器的使用方法。

js
function addEvent(dom, type, fn) {
	if (dom.addEventListener) {
		// 支持DOM2级事件处理方法的浏览器
		dom.addEventListener(type, fn, false);
	} else if (dom.attachEvent) {
		// 不支持DOM2级但支持attachEvent
		dom.attachEvent("on" + type, fn);
	} else {
		dom["on" + type] = fn; // 都不支持的浏览器
	}
}
 
const myInput = document.getElementById("myinput");
addEvent(myInput, "click", function() {
	console.log("绑定 click 事件");
});

解决一些其他的浏览器兼容性问题:

js
const getEvent = function(event) {
	// 获取事件对象
	return event || window.event; // IE下window.event
};
 
const getTarget = function(event) {
	// 获取事件元素
	const event = getEvent(event);
	return event.target || event.srcElement; // IE下event.srcElement
};
 
const preventDefault = function(event) {
	// 阻止默认事件
	const event = getEvent(event);
	if (event.preventDefault) {
		event.preventDefault();
	} else {
		event.returnValue = false;
	} // IE下
};
 
const cancelBubble = function(event) {
	const event = getEvent(event);
	if (event.stopPropagation) {
		event.stopPropagation();
	} else {
		event.cancelBubble = true;
	} // IE下
};
 
document.onclick = function(e) {
	preventDefault(e);
	if (getTarget(e) !== document.getElementById("myinput")) {
		console.log("外观模式");
	}
};

2. 与适配器模式的区别

  • 适配器模式是将一个对象包装起来以改变其接口,而外观模式是将一群对象包装起来以简化其接口。

  • 适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口。

标签

frontenddesignpattern

评论

相关文章

Singleton

单例模式:就是在整个运行时域,一个类只有一个实例对象。

2021年12月26日·2 分钟

Function Overloading

函数名相同,函数的参数列表不同(参数个数、参数类型),根据参数的不同之行不同的操作。

2021年12月19日·2 分钟

Stylelint

JS 代码有 ESLint 等格式化工具来校验、格式化,相对的,CSS 也有格式化工具。本文就主流 CSS 格式化工具 Stylelint 以及我们为什么要做 CSS 样式格式化略作介绍。

2021年12月12日·2 分钟

← 返回文章列表