JS的四种设计模式

工厂模式

简单的工厂模式可以理解为解决多个相似的问题

javascript 复制代码
function CreatePerson(name,age,sex) {
    var obj = new Object();
    obj.name = name;
    obj.age = age;
    obj.sex = sex;
    obj.sayName = function(){
        return this.name;
    }
    return obj;
}
var p1 = new CreatePerson("longen", 28 , 男 );
var p2 = new CreatePerson("tugenhua", 27 , 女 );
console.log(p1.name); // longen
console.log(p1.age);  // 28
console.log(p1.sex);  // 男
console.log(p1.sayName()); // longen
 
console.log(p2.name);  // tugenhua
console.log(p2.age);   // 27
console.log(p2.sex);   // 女
console.log(p2.sayName()); // tugenhua  

单例模式

只能被实例化(构造函数给实例添加属性与方法)一次

javascript 复制代码
// 单体模式
var Singleton = function(name){
    this.name = name;
};
Singleton.prototype.getName = function(){
    return this.name;
}
// 获取实例对象
var getInstance = (function() {
    var instance = null;
    return function(name) {
        if(!instance) {//相当于一个一次性阀门,只能实例化一次
            instance = new Singleton(name);
        }
        return instance;
    }
})();
// 测试单体模式的实例,所以a===b
var a = getInstance("aa");
var b = getInstance("bb");  

沙箱模式

将一些函数放到自执行函数里面,但要用闭包暴露接口,用变量接收暴露的接口,再调用里面的值,否则无法使用里面的值

javascript 复制代码
let sandboxModel=(function(){
    function sayName(){};
    function sayAge(){};
    return{
        sayName:sayName,
        sayAge:sayAge
    }
})()

发布者订阅模式

就例如如我们关注了某一个公众号,然后他对应的有新的消息就会给你推送

通知所有的订阅者:

发布者触发时依次执行缓存列表里所有的订阅者回调

javascript 复制代码
//发布者与订阅模式
    var shoeObj = {}; // 定义发布者
    shoeObj.list = []; // 缓存列表 存放订阅者回调函数
 
    // 增加订阅者
    shoeObj.listen = function(fn) {
        shoeObj.list.push(fn); // 订阅消息添加到缓存列表
    }
 
    // 发布消息
    shoeObj.trigger = function() {
            // 当事件触发的时候(状态发生变化),依次执行回调函数
            for (var i = 0, fn; fn = this.list[i++];) {
                fn.apply(this, arguments);//第一个参数只是改变fn的this,
            }
        }


    // 小红订阅如下消息
    shoeObj.listen(function(color, size) {
        console.log("颜色是:" + color);
        console.log("尺码是:" + size);
    });
    // 小花订阅如下消息
    shoeObj.listen(function(color, size) {
        console.log("再次打印颜色是:" + color);
        console.log("再次打印尺码是:" + size);
    });
    shoeObj.trigger("红色", 40);
    shoeObj.trigger("黑色", 42);  

通知指定的订阅者:

javascript 复制代码
//发布者与订阅模式
    var shoeObj = {}; // 定义发布者
    shoeObj.list = []; // 缓存列表 存放订阅者回调函数
    // ['xiaohong88':[],'xiaohua88':[]]
 
    // 增加订阅者
    shoeObj.listen = function(key,fn) {
        if(!this.list[key]){
            this.list[key] = []
        }
        this.list[key].push(fn); // 订阅消息添加到缓存列表
    }
 
    // 发布消息
    shoeObj.trigger = function() {
            var key = Array.prototype.shift.call(arguments),
            fns = this.list[key]

            // 当事件触发的时候(状态发生变化),依次执行回调函数
            for (var i = 0, fn; i < fns.length; i++) {
                fns[i].apply(this, arguments);//第一个参数只是改变fn的this,
            }
        }


    // 小红订阅如下消息
    shoeObj.listen('xiaohong88',function(color, size) {
        console.log("颜色是:" + color);
        console.log("尺码是:" + size);
    });
    shoeObj.listen('xiaohong88',function(color, size) {
        console.log("再次打印颜色是:" + color);
        console.log("再次打印尺码是:" + size);
    });
    shoeObj.trigger('xiaohong88',"红色", 40);
    // shoeObj.trigger("黑色", 42);  

抽离成一个对象

javascript 复制代码
//发布者与订阅模式
    var Event = {
        list:[],
        listen:function(key,fn) {
            if(!this.list[key]){
                this.list[key] = []
            }
            this.list[key].push(fn); // 订阅消息添加到缓存列表
        },
        trigger(){
            var key = Array.prototype.shift.call(arguments),
            fns = this.list[key]

            // 当事件触发的时候(状态发生变化),依次执行回调函数
            for (var i = 0, fn; i < fns.length; i++) {
                fns[i].apply(this, arguments);//第一个参数只是改变fn的this,
            }
        }
    }
    function installEvent(target,Source){
        return Object.assign(target,Source)
    }
    var shoeObj= installEvent(shoeObj = {},Event)

    // 小红订阅如下消息
    shoeObj.listen('xiaohong88',function(color, size) {
        console.log("颜色是:" + color);
        console.log("尺码是:" + size);
    });
    shoeObj.listen('xiaohong88',function(color, size) {
        console.log("再次打印颜色是:" + color);
        console.log("再次打印尺码是:" + size);
    });
    shoeObj.trigger('xiaohong88',"红色", 40);
    // shoeObj.trigger("黑色", 42);  
相关推荐
电子科技圈1 分钟前
IAR与Quintauris携手推进RISC-V汽车实时应用的功能安全软件开发
嵌入式硬件·安全·设计模式·编辑器·汽车·risc-v
Charles_go1 小时前
C#中级39、什么是依赖注入设计模式
java·设计模式·c#
ZHE|张恒5 小时前
设计模式(八)组合模式 — 以树结构统一管理对象层级
java·设计模式·组合模式
明洞日记7 小时前
【设计模式手册011】享元模式 - 共享细粒度对象的高效之道
java·设计模式·享元模式
帅中的小灰灰7 小时前
C++编程观察者设计模式
数据库·c++·设计模式
阿波罗尼亚8 小时前
Head First设计模式(六) 设计原则 命令模式
设计模式·命令模式
canonical_entropy11 小时前
模型驱动架构的数学内核:统一生成与演化的 Y = F(X) ⊕ Delta 不变式
数学·设计模式·架构
小毛驴85011 小时前
软件设计模式-代理模式
设计模式·系统安全·代理模式
雨中飘荡的记忆1 天前
工厂模式详解
设计模式
Charles_go1 天前
C#42、什么是建造者设计模式
设计模式