JavaScript代码片段学设计模式

简介: 设计模式是任何优秀软件的基础,JavaScript 也不例外,学习设计模式,让你对代码组织多一些思路,通过代码片段来学习编码思路对于开发者来说是比较容易理解的,本文继续通过代码片段简单展示常见的设计模式,但不深入设计模式本身,在此推荐一本书《JavaScript设计模式》,通俗易懂,阅读完之后可以大幅提升编码水平。

设计模式是任何优秀软件的基础,JavaScript 也不例外,学习设计模式,让你对代码组织多一些思路,通过代码片段来学习编码思路对于开发者来说是比较容易理解的,本文继续通过代码片段简单展示常见的设计模式,但不深入设计模式本身,在此推荐一本书《JavaScript设计模式》,通俗易懂,阅读完之后可以大幅提升编码水平。

构造函数模式

构造函数(Constructor Pattern)作为初始化具有特定属性和方法的对象的函数。构造器模式类似于该定义。我们使用这种模式来创建同一对象的多个实例。

function Article(title, author) {
    this.title = title;
    this.author = author;
    this.showTitle = () => console.log(this.title);
}
const article = new Article("JavaScript 设计模式", "devpoint");
article.showTitle();

原型模式

原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象,原型模式是一种对象创建型模式,通过从原型克隆对象来创建对象的新实例。

如果发现直接构造一个新对象很复杂且效率低下,那么原型模式非常适合这种情况。

function Article(title, author) {
    this.title = title;
    this.author = author;
    this.showTitle = () => console.log(this.title);
}
Article.prototype.showAuthor = function () {
    console.log(this.author);
};
const article = new Article("JavaScript 设计模式", "devpoint");
article.showAuthor();

工厂模式

工厂模式(Factory Pattern)的主要思想是将对象的创建与对象的实现分离,开发过程中可能在不知道它的情况下就使用了它的模式。在 JavaScript 中,它将对象创建与代码的其余部分分开,封装创建代码,公开 API 以生成不同的对象。

const Vehicle = function () {};
const Car = function () {
    this.say = function () {
        console.log("I am a car");
    };
};
const Truck = function () {
    this.say = function () {
        console.log("I am a truck");
    };
};
const Bike = function () {
    this.say = function () {
        console.log("I am a bike");
    };
};
const VehicleFactory = function () {
    this.createVehicle = (vehicleType) => {
        let vehicle;
        switch (vehicleType) {
            case "car":
                vehicle = new Car();
                break;
            case "truck":
                vehicle = new Truck();
                break;
            case "bike":
                vehicle = new Bike();
                break;
            default:
                vehicle = new Vehicle();
        }
        return vehicle;
    };
};
const vehicleFactory = new VehicleFactory();
const car = vehicleFactory.createVehicle("car");
const truck = vehicleFactory.createVehicle("truck");
const bike = vehicleFactory.createVehicle("bike");
car.say(); // I am a car
truck.say(); // I am a truck
bike.say(); // I am a bike

命令模式

命令模式(Command Pattern)的主要目的是将动作或操作封装为对象。

假设需要为电子商务构建支付系统,根据所选的付款方式,将需要处理特定的流程。

if (selectedPayment == "creditcard") {
    // 处理信用卡支付
}

一些付款方式只需要处理一个步骤,但其他方式可能不止一个步骤。通过使用上面的示例代码,提供的是实现,而不是接口,这会导致紧密耦合。

命令模式是提供松散耦合的一个很好的解决方案。系统不应了解有关每种特定付款方式处理的太多信息。为了实现这一点,该模式将请求操作的代码与执行实际实现的代码分开。

function Command(operation) {
    this.operation = operation;
}
Command.prototype.execute = function () {
    this.operation.execute();
};
function CreditCardPayment() {
    return {
        execute: function () {
            console.log("信用卡");
        },
    };
}
function WechatPayment() {
    return {
        execute: function () {
            console.log("微信支付");
        },
    };
}
function AliPayment() {
    return {
        execute: function () {
            console.log("支付宝");
        },
    };
}
function CreditCardCommand() {
    return new Command(new CreditCardPayment());
}
function WechatPalCommand() {
    return new Command(new WechatPayment());
}
function AliPayCommand() {
    return new Command(new AliPayment());
}
function PaymentHelper() {
    let paymentCommand;
    return {
        setPaymentCommand: function (command) {
            paymentCommand = command;
        },
        executeCommand: function () {
            paymentCommand.execute();
        },
    };
}
function run() {
    const paymentHelper = new PaymentHelper();
    paymentHelper.setPaymentCommand(new CreditCardCommand());
    paymentHelper.executeCommand();
    paymentHelper.setPaymentCommand(new WechatPalCommand());
    paymentHelper.executeCommand();
    paymentHelper.setPaymentCommand(new AliPayCommand());
    paymentHelper.executeCommand();
}
run();

观察者模式

观察者模式(Observer Pattern)又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。

可以使用日常生活中,期刊订阅的例子来解释一下上面的概念。期刊订阅包含两个主要的角色:期刊出版方和订阅者,他们之间的关系如下:

  • 期刊出版方 - 负责期刊的出版和发行工作
  • 订阅者 - 只需执行订阅操作,新版的期刊发布后,就会主动收到通知,如果取消订阅,以后就不会再收到通知。
function Newsletter() {
    this.observers = [];
}
Newsletter.prototype = {
    subscribe: function (observer) {
        this.observers.push(observer);
    },
    unsubscribe: function (observer) {
        this.observers = this.observers.filter((ob) => ob !== observer);
    },
    notify: function () {
        this.observers.forEach((observer) =>
            console.log("你好!" + observer.toString())
        );
    },
};
const subscriber1 = "订阅者 1";
const subscriber2 = "订阅者 2";
const newsletter = new Newsletter();
newsletter.subscribe(subscriber1);
newsletter.subscribe(subscriber2);
newsletter.notify(); // 输出:你好!订阅者 1 ; 你好!订阅者 2
newsletter.unsubscribe(subscriber2);
newsletter.notify(); // 你好!订阅者 1

单体模式

单体模式(Singleton Pattern)是 JavaScript 中最基本但又最实用的模式之一,比其他任何模式都更常用。这种模式提供了一种将代码组织为一个逻辑单元的方法,可用于减少全局变量的数量。

const utils = (function () {
    let instance;
    function initialize() {
        return {
            sum: function (a, b) {
                return a + b;
            },
        };
    }
    return {
        getInstance: function () {
            if (!instance) {
                instance = initialize();
            }
            return instance;
        },
    };
})();
const sum = utils.getInstance().sum(1, 2);
console.log(sum); // 3

单体模式主要的好处在于它对代码组织作用,把相关的方法和属性组织在一个不会被多次实例化的单体中,使代码的调试和维护变得轻松,但会导致模块间的强耦合。

模块模式

模块模式(Module Pattern)也可以说是单体模式的一种,该模式是用于实现软件模块概念的设计模式,可以将模块内的函数、变量和属性设为公共或私有成员。

const articleModule = (function () {
    // 私有
    const title = "JavaScript 设计模式";
    // 公共
    return {
        printTitle: function () {
            console.log(title);
        },
    };
})();
articleModule.printTitle(); // JavaScript 设计模式

总结

以上只是一些设计模式的简单实例,对其有个初步的理解,在开发过程中可以尝试使用上面实例的方式编写代码,对提高编码质量是有一定帮助的。


相关文章
|
12天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
1月前
|
JSON JavaScript 前端开发
JavaScript原生代码处理JSON的一些高频次方法合集
JavaScript原生代码处理JSON的一些高频次方法合集
|
2月前
|
存储 JavaScript 前端开发
非常实用的JavaScript一行代码(整理总结)
非常实用的JavaScript一行代码(整理总结)
32 0
|
2月前
|
JavaScript 前端开发 测试技术
如何编写JavaScript模块化代码
如何编写JavaScript模块化代码
14 0
|
2天前
|
JavaScript 前端开发 测试技术
编写JavaScript模块化代码主要涉及将代码分割成不同的文件或模块,每个模块负责处理特定的功能或任务
【5月更文挑战第10天】编写JavaScript模块化代码最佳实践:使用ES6模块或CommonJS(Node.js),组织逻辑相关模块,避免全局变量,封装细节。利用命名空间和目录结构,借助Webpack处理浏览器环境的模块。编写文档和注释,编写单元测试以确保代码质量。通过这些方法提升代码的可读性和可维护性。
8 3
|
12天前
|
JavaScript 前端开发 开发工具
【JavaScript 与 TypeScript 技术专栏】TypeScript 如何提升 JavaScript 代码的可读性与可维护性
【4月更文挑战第30天】TypeScript 提升 JavaScript 代码的可读性和可维护性,主要通过静态类型系统、增强代码组织、智能提示与错误检测、文档化和在大型项目中的优势。静态类型减少误解,类和接口提供结构,智能提示提高编码效率,类型注解充当内置文档。在大型项目中,TypeScript 降低理解差异,平滑迁移现有 JavaScript 项目,助力提高开发效率和项目质量。
|
19天前
|
JavaScript 前端开发 算法
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
在开发中,采用简洁的语法和结构,遵循一致的命名规范,具有良好的代码组织和注释,能很好的提高代码的质量。可读性:易于阅读和理解。清晰的命名、简洁的语法和良好的代码结构可以使代码的意图更加明确,降低理解代码的难度,提高代码的可读性。可维护性:易于维护。当代码逻辑清晰、结构简洁时,开发者可以更快速地定位和修复bug,进行功能扩展或修改。同时,可读性高的代码也有助于后续的代码重构和优化。可扩展性:更具有扩展性和灵活性。清晰的代码结构和简洁的代码风格使得添加新功能、修改现有功能或扩展代码更加容易。
< JavaScript小技巧:如何优雅的用【一行代码 】实现Js中的常用功能 >
|
19天前
|
前端开发 JavaScript 容器
JavaScript、CSS像素动画特效代码
此示例创建一个带有像素粒子的容器,每隔300毫秒就会动态添加一个新的像素粒子,然后通过CSS的关键帧动画(`@keyframes`)使它们产生上升和逐渐消失的动画效果。你可以根据需要修改像素粒子的颜色、大小、动画效果和创建速度。
14 0
|
26天前
|
JavaScript
js校验统一社会信用代码
js校验统一社会信用代码
27 0
|
29天前
|
监控 前端开发 JavaScript
如何在浏览器中使用javaScript进行代码调试
【4月更文挑战第11天】在浏览器中调试JavaScript是前端开发的关键技能。使用开发者工具(可通过F12、右键检查或菜单栏访问),遵循以下步骤:1) 打开Sources标签页查看所有脚本;2) 设置断点在需要暂停的代码行;3) 刷新页面触发断点;4) 利用调试工具如Scopes、Watch、Call Stack等检查代码状态;5) 使用Console辅助调试;6) 利用其他工具如Network、Performance和Memory进行性能分析。确保使用最新工具,保持代码清晰,以提升调试效率。
50 4