Skip to content

代理模式

什么是代理模式?

代理模式是一种结构型设计模式,它为一个对象提供一个代用品或占位符,以便控制对它的访问。代理对象可以在客户端和真实对象之间起到中介的作用,通常用于延迟加载、权限控制、日志记录等场景。

代理模式的实现原理

代理模式通常涉及三个角色:

  • 主题(Subject):定义真实对象和代理对象的共同接口。
  • 真实主题(RealSubject):实现了主题接口的真实对象。
  • 代理(Proxy):持有真实主题的引用,并实现主题接口,控制对真实主题的访问。

示例代码

1.小明送花的场景

在这个场景中,小明希望将花送给 A,但由于他无法判断 A 的心情,因此直接送花可能会导致花被扔掉。为了避免这种情况,小明将花交给了 B,B 负责监听 A 的心情变化,并在合适的时机将花转交给 A。

js
let Flower = function () {};

let xiaoming = {
  sendFlower: function (target) {
    let flower = new Flower();
    target.receiveFlower(flower);
  },
};

let B = {
  receiveFlower: function (flower) {
    A.listenGoodMood(function () {
      A.receiveFlower(flower);
    });
  },
};

let A = {
  receiveFlower: function (flower) {
    console.log('收到花: ' + flower);
  },
  listenGoodMood: function (fn) {
    setTimeout(function () {
      fn();
    }, 1000);
  },
};

xiaoming.sendFlower(B);
  • 代理对象:B 是代理对象,它控制对 A 的访问。
  • 真实对象:A 是接收花的真实对象。
  • 控制访问:B 通过监听 A 的心情变化,决定何时将花转交给 A,从而避免了不合时宜的送花行为。

2. HTML 元素事件代理

在这个示例中,使用事件代理的方式来处理点击事件。通过将事件监听器添加到父元素 ul 上,而不是每个 li 元素上,所有的点击事件都会被捕获并处理。

html
<ul id="ul">
  <li>1</li>
  <li>2</li>
  <li>3</li>
</ul>
<script>
  let ul = document.querySelector('ul');
  ul.addEventListener('click', (event) => {
    console.log(event.target);
  });
</script>

优缺点

优点

  • 可以在不改变真实主题的情况下增加额外的功能。
  • 可以控制对真实主题的访问,提供权限控制。

缺点

  • 代理模式可能会增加系统的复杂性。
  • 代理对象的存在可能会导致性能开销。

总结

代理模式是一种灵活的设计模式,可以在多种场景中使用,尤其是在需要控制对某些对象的访问时。通过合理使用代理模式,可以提高系统的可维护性和扩展性。