通过 追求故事 轻松理解JavaScript 的代理模式

85 阅读3分钟

引言

在软件开发中,设计模式是解决常见问题的经典方案。代理模式(Proxy Pattern)作为结构型设计模式之一,在 JavaScript 中有着广泛的应用。本文将通过一个生动的送花故事,形象的解释什么是代理模式。

1. 首先我们要知道JavaScript 基础 ->面向对象

1.1 弱类型与动态特性

JavaScript 是一种弱类型语言,变量的类型由值决定。例如:

let hxt = 21; // 数字类型
hxt = '💛天'; // 字符串类型

1.2 对象与属性

在 JavaScript 中,对象是现实世界和关系的关键抽象化。每个对象都有属性和方法:

const hxt = {
    name: '💛天',
    age: 20,
    tall: 187,
    hometown: '山东临沂',
    isSingle: true,
};

并且JavaScript允许在运行时动态添加、修改或删除对象的属性和方法,无需new操作符,可以直接通过{}拿到对象 [] 拿到数组---这就是JavaScript的动态特性

2. 面向对象编程

2.1 对象的基本规则

  • 属性 :描述对象的特征,例如姓名、年龄等。
  • 方法 :描述对象的行为,例如送花、接收花等。

2.2 示例代码

以下是一个简单的对象示例:

const pyc = {
    name: '彭奕淳',
    age: 20,
    hometown: '江西新余',
    isSingle: true,
    sendFlower: function(girl){
        console.log(pyc.name + '给' + girl.name + '送了99朵玫瑰');
        girl.reciveFlower(pyc);
    }
};

3. 代理模式

3.1 代理模式简介

代理模式是一种设计模式,它允许一个对象(代理)控制对另一个对象(真实对象)的访问。在以下例子中,小红作为代理,帮助小彭送花给小美:

//彭奕淳喜欢的小美(花的接受者)
const xm = {
    name: '小美',
    room: '408',
    reciveFlower: function(sender){//接受花的方法
        console.log(xm.name + '收到了' + sender.name + '送的99朵玫瑰花');
    }
};
//小红对象(代理)
const xh = {
    name: '小红',
    hometown: '新余',
    room: '408',
    receiveFlower: function(sender){
        setTimeout(() => { // 定时器
          xm.xq = 99;
          xm.receiveFlower(sender)
    }, 3000)
    }
};
pyc.sendFlower(xh);

在代码中小红和小美都实现了 receiveFlower这个方法,体现了接口的概念,但receiveFlower内部的代码可以是不一样的并且小美是“最终接受花的对象”,小红作为中间人把花转送给小美则是“代理”。

代理模式在软件开发中有许多优点,以下是其主要优势:

  1. 控制访问 :代理模式可以控制对真实对象的访问。例如,在代码中,小红作为代理,可以决定何时将花转交给小美。
  2. 简化接口 :代理可以为复杂对象提供一个简化的接口,使得客户端更容易使用。例如,小红提供了一个与小美相同的 receiveFlower 方法,使得彭奕淳无需关心具体的接收者是谁。
  3. 增加灵活性 :代理模式使得在不修改原有代码的情况下,可以灵活地改变对象的行为。在代码中,小红可以在转交花之前执行一些额外的逻辑,如延迟3秒。

6. 总结

通过这个简单的追求故事,我们看到了JavaScript中面向对象编程的强大之处。代理模式的使用展示了如何在不修改原有代码的情况下,灵活地扩展和改变对象的行为,起到一个中间助手的作用。这种设计模式在复杂的软件系统中尤其有用,它可以帮助我们更好地组织代码,提高代码的可维护性和可扩展性。

JavaScript的灵活性和强大的面向对象特性,使得它成为现代Web开发中不可或缺的工具。通过深入理解这些概念,我们可以编写出更加优雅和高效的代码。