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 小时前
前端开发设计模式——责任链模式
设计模式·责任链模式
liang89992 小时前
设计模式之策略模式(Strategy)
设计模式·策略模式
马剑威(威哥爱编程)3 小时前
读写锁分离设计模式详解
java·设计模式·java-ee
修道-03233 小时前
【JAVA】二、设计模式之策略模式
java·设计模式·策略模式
G皮T6 小时前
【设计模式】结构型模式(四):组合模式、享元模式
java·设计模式·组合模式·享元模式·composite·flyweight
W_Meng_H6 小时前
设计模式-组合模式
设计模式·组合模式
吾与谁归in16 小时前
【C#设计模式(8)——过滤器模式(Adapter Pattern)】
设计模式·c#·过滤器模式
G皮T17 小时前
【设计模式】行为型模式(一):模板方法模式、观察者模式
java·观察者模式·设计模式·模板方法模式·template method·行为型模式·observer
iFlyCai20 小时前
23种设计模式的Flutter实现第一篇创建型模式(一)
flutter·设计模式·dart
zhouzhihao_0720 小时前
程序代码设计模式之模板方法模式(1)
java·设计模式·模板方法模式