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

评论 (0)

评论功能仅在主站可用,请访问 zephyr110.vercel.app

相关文章

OffscreenCanvas

MDN-OffscreenCanvas

2025年12月10日·7 分钟

Service Worker

Web worker 是一种在浏览器中运行的后台脚本,它可以在独立的线程中执行任务,而不会阻塞主线程的执行。Web worker 的主要作用是处理耗时的计算任务,例如图片处理、文本分析、数据处理等,以避免阻塞主线程,提高页面的响应性能

2024年5月28日·4 分钟

vue-tour二次封装

npm install vue-tour

2023年7月22日·7 分钟

← 返回文章列表