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);  
相关推荐
海特伟业21 小时前
隧道调频广播覆盖-隧道调频广播无线覆盖系统建设要点、难点分析与解决应对
运维·设计模式
sg_knight21 小时前
设计模式实战:享元模式(Flyweight)
python·设计模式·享元模式·flyweight
Swift社区1 天前
AI 时代,ArkUI 的设计模式会改变吗?
人工智能·设计模式
数据中穿行1 天前
访问者设计模式全方位深度解析
设计模式
宁雨桥1 天前
前端设计模式面试题大全
前端·设计模式
数据中穿行1 天前
迭代器设计模式全方位深度解析
设计模式
数据中穿行1 天前
观察者设计模式全方位深度解析
设计模式
程序员Terry1 天前
别老写重复代码了!模版方法模式一次讲透
java·设计模式
数据中穿行1 天前
建造者模式全方位深度解析
设计模式