介绍

  • 使用者无权访问目标对象
  • 中间加代理,通过代理做授权和控制

示例

  • 科学上网,访问github.com
  • 明星经纪人

UML类图

点击查看【processon】

代码

  1. // 明星
  2. let star = {
  3. name: '张XX',
  4. age: 25,
  5. phone: '13910733521'
  6. }
  7. // 经纪人
  8. let agent = new Proxy(star, {
  9. get: function (target, key) {
  10. if (key === 'phone') {
  11. // 返回经纪人自己的手机号
  12. return '18611112222'
  13. }
  14. if (key === 'price') {
  15. // 明星不报价,经纪人报价
  16. return 120000
  17. }
  18. return target[key]
  19. },
  20. set: function (target, key, val) {
  21. if (key === 'customPrice') {
  22. if (val < 100000) {
  23. // 最低 10w
  24. throw new Error('价格太低')
  25. } else {
  26. target[key] = val
  27. return true
  28. }
  29. }
  30. }
  31. })
  32. // 主办方
  33. console.log(agent.name)
  34. console.log(agent.age)
  35. console.log(agent.phone)
  36. console.log(agent.price)
  37. // 想自己提供报价(砍价,或者高价争抢)
  38. agent.customPrice = 150000
  39. // agent.customPrice = 90000 // 报错:价格太低
  40. console.log('customPrice', agent.customPrice)

场景

  1. - $.proxy
  2. ```javascript
  3. $("#d1").click(function() {
  4. const fn = function() {
  5. setTimeout($.proxy(function() {
  6. // this 符合期望
  7. $(this).addClass('d2')
  8. }, this), 1000)
  9. }
  10. })
  11. // =>>
  12. $("#d1").click(function() {
  13. let fn = function() {
  14. $(this).addClass('d2')
  15. }
  16. fn = $.proxy(fn, this)
  17. setTimeout(fn, 1000)
  18. })
  • es6的proxy
  • 在家访问公司内网,利用代理

代理模式和适配器模式比较

  • 适配器模式:提供不同的接口(如不同版本的插头)
  • 代理模式:提供一摸一样的接口

代理模式和装饰器模式比较

  • 装饰器模式:扩展功能,原有功能不变而且可直接使用(手机的手机壳)
  • 代理模式:显示原有功能,但是是经过限制和阉割之后的