JavaScript中的设计模式-代理模式

简介: 设计模式在我们编程中是十分重要的!设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

前言

设计模式在我们编程中是十分重要的!

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

什么是设计模式?

在软件设计过程中,针对特定问题的简洁而优雅的解决方案。

把之前的经验总结并且合理运用到某处场景上,能够解决实际的问题。

设计模式五大设计原则(SOLID)

  • S-单一职责原则

    即一个程序只做好一件事
  • O-开放封闭原则

    可扩展开放,对修改封闭
  • L-里氏置换原则

    子类能覆盖父类,并能出现在父类出现的地方
  • I-接口独立原则

    保持接口的单一独立
  • D-依赖导致原则

    使用方法只关注接口而不关注具体类的实现

为什么需要设计模式?

  • 易读性

    使用设计模式能够提升我们的代码可读性,提升后续开发效率
  • 可拓展性

    使用设计模式对代码解耦,能很好的增强代码的yi修改性和拓展性
  • 复用性

    使用设计模式可以复用已有的解决方案,无需重复相同工作
  • 可靠性

    使用设计模式能够增加系统的健壮性,使代码编写真正工程化

代理模式

定义:为一个对象提供一个代用品或者占位符,以便控制对它的访问。替身对象可对请求预先进行处理,再决定是否转交给本体对象。

假如项目中一个图片过大,短时间内加载不出来的时候,用户只能看见白屏,体验感就会非常糟糕,这时候我们就可以用一个替身来暂时替代图片。

当真身被访问的时候,我们先访问替身对象,让替身代替真身去做一些事情,之后在转交给真身处理。

应用场景:当我们不方便直接访问某个对象时,或不满足需求时,可考虑使用一个替身对象来控制该对象的访问。

来看这段代码:

// 原生函数
const rawImage = (() => {
    const imgNode = document.createElement("img");
    document.body.appendChild(imgNode);
    return {
        setSrc:(src)=> {
            imgNode.src = "./loading.gif";
            const img = new Image();
            img.src = src;
            img.onload = () => {
                imgNode.src = this.src;
            }
        }
    }
})();

rawImage.setSrc("http://xxx.gif");

这个xxx.gif的加载时间可能要到10s左右,我们首先预加载了一个loading图,用户看到的过程是最开始看见loading,当xxx加载完成后,也就是onload执行完后,就会做一个替换的效果,完成了这个功能。

思考:这段代码是不是耦合性太强了啊?

是的,loading的逻辑跟我们实际加载的逻辑是耦合在一起的,我们要做两个事情,一个是设置loading,一个是设置图片链接。那我们给他分开,用代理函数去做预处理,加载loading,用原生函数提供一个设置图片链接的功能。

实现一下:

// 原生函数
const rawImage = (() => {
    const imgNode = document.createElement("img");
    document.body.appendChild(imgNode);
    return {
        setSrc:(src)=> {
            imgNode.src = src;
        },
    };
})();

// 代理函数
const proxyImage = (() => {
    const img = new Image();
    img.onload = () =>{
        rawImage.setSrc(this.src);
    };
    return {
        setSrc:(src) => {
            rawImage.setSrc("./loading.gif");
            img.src = src;
        },
    };
})();

proxyImage.setSrc("http://xxx.gif");

我们通常会进行一些请求的预处理的时候使用代理模式。

相关文章
|
16天前
|
设计模式 JavaScript 前端开发
JavaScript设计模式--访问者模式
【10月更文挑战第1天】
26 3
|
1月前
|
设计模式 缓存 安全
设计模式——代理模式
静态代理、JDK动态代理、Cglib 代理
设计模式——代理模式
|
1月前
|
设计模式 Java 数据安全/隐私保护
Java设计模式-代理模式(7)
Java设计模式-代理模式(7)
|
2月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
35 1
|
2月前
|
设计模式 缓存 Java
【十一】设计模式~~~结构型模式~~~代理模式(Java)
文章详细介绍了代理模式(Proxy Pattern),这是一种对象结构型模式,用于给对象提供一个代理以控制对它的访问。文中阐述了代理模式的动机、定义、结构、优点、缺点和适用环境,并探讨了远程代理、虚拟代理、保护代理等不同代理形式。通过一个商务信息查询系统的实例,展示了如何使用代理模式来增加身份验证和日志记录功能,同时保持客户端代码的无差别对待。此外,还讨论了代理模式在分布式技术和Spring AOP中的应用,以及动态代理的概念。
【十一】设计模式~~~结构型模式~~~代理模式(Java)
|
2月前
|
设计模式 JavaScript 前端开发
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
小白请看 JS大项目宝典:设计模式 教你如何追到心仪的女神
|
2月前
|
设计模式
设计模式的基础问题之代理模式在工作中的问题如何解决
设计模式的基础问题之代理模式在工作中的问题如何解决
|
3月前
|
设计模式 JavaScript Go
js设计模式【详解】—— 状态模式
js设计模式【详解】—— 状态模式
59 7
|
3月前
|
设计模式 JavaScript
js设计模式【详解】—— 桥接模式
js设计模式【详解】—— 桥接模式
56 6
|
3月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
47 6