JS脱口秀:代理模式——从送花记到编程情商的飞跃

120 阅读4分钟

何为代理模式

在JavaScript的世界里,编写代码不仅仅是堆砌语法糖,而是一场生动的脱口秀,充满了智慧与幽默,尤其是当我们深入探讨设计模式时,这场秀就变得更加精彩纷呈。今天,我们就来聊聊其中的一位“中介”——代理模式(Proxy Pattern),以及它是如何在JS的舞台上大放异彩的。

image.png

开场:张三与李四的“花”样年华

故事的开始很简单,就像一个传统的浪漫桥段:张三,一位程序员界的暖男,决定给心仪的女孩李四送一束花,表达他的爱慕之情。在这个环节中,张三和李四是我们的两个主角,我们要先完成这段自然语言到代码的映射,JS是一门是强大表现力的语言,他们可以简单地用 JSON 对象字面量来表示:

自然语言到代码的映射:

const obj = {
    name: '张三',
    // string
    company: undefined, // 未定义
    girlFriend: null, // 为空
    // number
    age: 18,
    sex: '男',
    // boolean
    isSingle: true,
    // function 函数也是对象
    sendFlower: function(target) {
        target.receiveFlower(this);
    }
};

const obj2 = {
    name: '李四',
    age: 20,
    sex: '女',
    isSingle: true,
    receiveFlower: function(sender) {
        console.log(`${this.name}收到了${sender.name}送出的花`);
    }
};

// 送花
obj.sendFlower(obj2);

调用张三中的sendFlower()方法后,就可以直接完成对李四的一个送花的动作;

image.png

但是有时候,张三送花给李四,张三并不知道李四是否会接受,所以这时候的张三就想了一个办法,找来了李四的室友,王五。

情节升级:王五的闪亮登场

然而,故事不会如此简单。当李四不想接受这份心意时,王五(obj3)——李四的好友兼老乡,带着相同的receiveFlower接口华丽入场,成为了这场爱情传递的关键角色。王五不仅能代收鲜花,还能确保李四在最合适的时机收到这份惊喜:

const obj3 = {
    name: '王五',
    age: 22,
    sex: '女',
    isSingle: true,
    receiveFlower: function(sender) {
        // 判断李四的“心情指数”是否达标,若不达标则稍后重试
        if(obj2.xq < 90){
            setTimeout(() => {
                obj2.xq = 91; // 假设时间能改变一切
                obj2.receiveFlower(sender);
            }, 2000);
        } else {
            obj2.receiveFlower(sender);
        }
    }
};

王五的出现,就像是剧情中的一个巧妙转折,引入了代理模式的核心概念:当直接访问对象有困难或不那么高效时,我们可以使用一个代理对象来控制对真实对象的访问。

完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>面向对象的世界</title>
</head>
<body>
    <script>
        // 自然语言 到 代码的映射
        // JS 是强大表现力的语言,[] 数组
        // {} JSON 对象字面量
        // object
        const obj = {
            // string
            company: undefined, // 未定义
            girlFriend: null, // 为空
            name: '张三',
            // number
            age: 18,
            sex: '男',
            // boolean
            isSingle: true,
            // function 函数也是对象
            sayHi: function(){
                console.log('hi');
            },
            // 形参
            sendFlower:function(target) {
                target.receiveFlower(this)
            }
        }
        const obj2 = {
            name: '李四',
            xq: 50,
            age: 20,
            sex: '女',
            isSingle: false,
            sayHi: function(){
                console.log('hi');
            },
            receiveFlower:function (sender) {
                // console.log(this.name + '收到了' + sender.name + '送出的花');
                // 提升代码可读性   
                console.log(`${this.name}收到了${sender.name}送出的花`);
                if(this.xq >= 90){
                    console.log('万达');
                }else{
                    console.log('不约');
                }
            }
        }
        // 实参
        // obj.sendFlower(obj2);
        // 比较复杂
        // obj3 proxy 代理对象
        obj3 ={
            name: '王五',
            age: 22,
            sex: '女',
            isSingle: true,
            sayHi: function(){
                console.log('hi');
            },
            receiveFlower:function (sender) {
                // 代替obj2收花  实现同样的方法,也就是接口
                if(obj2.xq < 90){
                    console.log('等一等');
                    setTimeout(function(){
                        obj2.xq = 91;
                        obj2.receiveFlower(sender);
                },2000)
            }else{
                    obj2.receiveFlower(sender);
                }

            }
        }
        // 当obj3 也具有和 obj2 一样的receiveFlower方法,obj3 就可以代替obj2 收花;
        // proxy 代理模式   
        // receiveFlower 也叫接口   面向接口编程
        // obj.sendFlower(obj3);
        obj.sendFlower(obj2);
    </script>
</body>
</html>

代理模式的智慧光芒

在这场送花的“脱口秀”中,代理模式Proxy Pattern)悄然登台,展示了它的灵活性与实用性。王五作为李四的代理,完美地体现了设计模式的精髓——解耦与扩展。通过代理,张三无需了解李四的具体情况,只需与代理(王五)交互,从而实现了需求的间接满足。

设计模式,特别是这23种经典模式,不仅仅是编程的技术手段,更是解决复杂问题的哲学思考。就像这段HTML页面中的JavaScript代码,不仅展示了如何通过对象和函数构建交互逻辑,更重要的是,它揭示了如何在变化中保持代码的优雅与弹性。

小结:从代码到人生智慧的映射

通过这场“送花记”,我们不仅学习了代理模式的应用,更体会到了“写代码而非写语法”的深意。编程不仅是技术的堆砌,更是情商(“码商”)的体现。正如设计模式在复杂系统中构建的桥梁,连接了功能与效率,我们在生活中也需要这样的智慧,去建立人与人之间的理解与协作。

最终,这场以JavaScript为语言的脱口秀,以一束花的传递,讲述了代理模式的故事,也提醒我们:在不断变化的世界中,保持代码的灵活性,就如同在生活中保持一颗开放和适应变化的心,是通往成功的必经之路。