原生js常用设计模式、单例,观察者、工厂

前言

今天给大家带来几种常用的设计模式的讲解、

讲解设计模式之前,我们先来说说什么是设计模式,它有什么作用。

在我看来,设计模式就是前人工作经验的总结,工作中不用设计模式也能写,但是用了设计模式能够帮助我们写出更好的代码,

设计模式的好处

提高代码的复用性,解耦代码,提高代码质量,

同时也是深入理解框架,封装一些插件时候必备的

设计原则

开放封闭原则【OCP】 简单来说,就是可扩展,不可修改

单一功能原则【SRP】 一个方法只做一件事

最少知识原则【LKP】 尽量减少对其他类的依赖,松耦合

ok,了解了原则之后,就可以开始来

第一个设计模式

工厂模式

批量生产对象,就是函数内部,生成对象实例,然后return出去。

// 工厂模式
function factoryFn(name,age){
    var obj = new Object();
    obj.name = name;
    obj.age = age;

    return obj;
}
var _obj = factoryFn('姚明','35');

console.log(_obj); // {name: "姚明", age: "35"}

原型模式

就是函数声明为空,利用prototype原型来定义些属性和方法

function ProtoFn() {}

// 原型上添加方法
ProtoFn.prototype = {
    constructor: ProtoFn, // 修复原型链
    say(_n){
        console.log(_n);
    },
    sayFn2(_n){
        console.log(_n);
    }
};

// 实例化
var _protoObj = new ProtoFn();
_protoObj.say('你好呀');
_protoObj.sayFn2('这是原型模式');

混合模式

就是 构造 + 原型 ,也是咱们常用的

function MixinFn(name,age) {
    this.name = name;
    this.age = age;
}
MixinFn.prototype.say = function(_n) {
    console.log(_n);
}
var _mixin = new MixinFn('牛大力','20');

console.log(_mixin); // MixinFn {name: "牛大力", age: "20"}
_mixin.say('这是混合模式,工作中上用的多');

单例模式

同一时间只有一个实例,jq就是典型的

var singleFn = (function() {
    // 装载单例的对象
    var _obj = null;
    // 初始化方法
    function initFn(args) {
        // 批量添加属性
        for (var key in args) {
            this[key] = args[key];
        }
    }
    // 返回对象
    return {
        getInstance: function(args) {
            // 单例模式,判断是否存在
            if(_obj === null) _obj = new initFn(args);
            return _obj;
        }
    }
})();

// 生成实例
var _one = singleFn.getInstance({
    name: '12',
    age: 18
});
console.log(_one); // initFn {name: "12", age: 18}

策略模式

简单来说,为了避免多次if,

// 加薪,a 级别 3倍,b 2倍,c 1倍
var obj = {
    'A': function (money){
        return money * 3;
    },
    'B': function (money){
        return money * 2;
    },
    'c': function (money){
        return money;
    }
}
// 计算函数
var reducers = function (level,money) {
    // 返回小钱钱
    return obj[level](money);
}
var myMoney = reducers('A',10000);
console.log(myMoney); // 30000

观察者模式

就是我干了什么,让别人来看,

/* 发布者(被观察者)
    订阅者(观察者)
    主题对象(订阅都在主题对象注册)
    发布消息 */

// 发布者 - 被观察者 publish 发布
var pub = {
    // 方法
    publish() {
        // 做的一些逻辑
        var xxx = 11;
        // 通知订阅至
        _dep.notify();
    }
};

// 订阅者 -观察者
var sub1 = {
    update(){
        console.log(111);
    }
};
var sub2 = {
    update(){
        console.log(222);
    }
};

// 主题对象,订阅者都在主题对象中被注册
function Dep() {
    this.subscribe = [sub1,sub2];
}
// notify 通知
Dep.prototype.notify = function() {
    for (const item of this.subscribe) {
        // 执行每一项
        item.update();
    }
}

// 发布消息
var _dep = new Dep();

// 发布者发布消息,主题对象执行
pub.publish();

代理模式

提供访问接口,隐藏原对象

// 主体对象
function sendMsg(msg) {
    console.log(msg); //你好,是兄弟就来砍我 
}

// 代理方法,过滤敏感字
function proxyFn(msg) {
    if(typeof msg !== 'string') return;
    
    var reg = /s/ig
    // 过滤敏感字
    msg = msg.replace(reg,'');
    // 发送信息
    sendMsg(msg);
}

proxyFn('你好s,是兄弟S就来砍我');

这就是比较常用的几种设计模式了,还有更多的 中介者模式、装饰模式、迭代器模式,挺多的,这里就不一一来讲了。

谢谢大家观看,有问题可以评论提呀😄!

总结一句:

设计模式就是前人经验,为了解决业务问题存在,开发时候不用刻意追求,用到时候再说了。

21 声望
0 粉丝
0 条评论
推荐阅读
原生js实现类jq框架
前言 今天来实现一个简单的js框架,类似jq的功能,实现了增减class,增减属性,链式调用,合并对象等功能, 更加深入理解下js原型prototype的应用,是之前承诺的原型模式应用的文章,欢迎评论交流 初始化方法 {代...

yuanfa247阅读 1.5k

ESlint + Stylelint + VSCode自动格式化代码(2023)
安装插件 ESLint,然后 File -> Preference-> Settings(如果装了中文插件包应该是 文件 -> 选项 -> 设置),搜索 eslint,点击 Edit in setting.json

谭光志34阅读 20.8k评论 9

安全地在前后端之间传输数据 - 「3」真的安全吗?
在「2」注册和登录示例中,我们通过非对称加密算法实现了浏览器和 Web 服务器之间的安全传输。看起来一切都很美好,但是危险就在哪里,有些人发现了,有些人嗅到了,更多人却浑然不知。就像是给门上了把好锁,还...

边城32阅读 7.3k评论 5

封面图
涨姿势了,有意思的气泡 Loading 效果
今日,群友提问,如何实现这么一个 Loading 效果:这个确实有点意思,但是这是 CSS 能够完成的?没错,这个效果中的核心气泡效果,其实借助 CSS 中的滤镜,能够比较轻松的实现,就是所需的元素可能多点。参考我们...

chokcoco24阅读 2.3k评论 3

在前端使用 JS 进行分类汇总
最近遇到一些同学在问 JS 中进行数据统计的问题。虽然数据统计一般会在数据库中进行,但是后端遇到需要使用程序来进行统计的情况也非常多。.NET 就为了对内存数据和数据库数据进行统一地数据处理,发明了 LINQ (L...

边城17阅读 2k

封面图
过滤/筛选树节点
又是树,是我跟树杠上了吗?—— 不,是树的问题太多了!🔗 相关文章推荐:使用递归遍历并转换树形数据(以 TypeScript 为例)从列表生成树 (JavaScript/TypeScript) 过滤和筛选是一个意思,都是 filter。对于列表来...

边城18阅读 7.9k评论 3

封面图
Vue2 导出excel
2020-07-15更新 excel导出安装 {代码...} src文件夹下新建一个libs文件夹,新建一个excel.js {代码...} vue页面中使用 {代码...} ===========================以下为早期的文章今天在开发的过程中需要做一个Vue的...

原谅我一生不羁放歌搞文艺14阅读 20.1k评论 9

21 声望
0 粉丝
宣传栏