前端设计模式

184 阅读2分钟

1工厂模式==>可以理解为解决相同的问题使用同一个方法

function Cre(name, age, sex) {  
           function Obj() {   
                this.name = name; 
                this.age = age;    
                this.sex = sex;    
                Obj.prototype.sayName = function () {     
                        console.log(this.name);      
                        console.log(this.age);      
                        console.log(this.sex);
                }  
            }
  return new Obj(name, age, sex)
}
var p1 = Cre('xxx', 22, '22')
p1.sayName()
var p2 = Cre('aaa', 33, '33')
p2.sayName()

2.单例模式==>可以理解为在整个程序的运行过程中,只有一个实例,该实例有则使用原有的实例,无就创建

var Person = (function () {  
  var instance = null;  //保存创建出来的实例  
  var Singleton = function (name) {   
     this.name = name;    
     Singleton.prototype.getName = function () {      
        return this.name;    
      }  
   }; 
   return function () {    
     if (!instance) { 
        return instance = new Singleton()    
     }    
    return instance}
})()
var p1 = Person()
var p2 = Person()
console.log(p1===p2); //打印true

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

let sandboxModel=(function(){
   function sayName(){};
   return{
        sayName:sayName,
  }
})()

4.观察者模式

核心步骤:
1.提供一个发布者(信息的发布者)
2.提供观察者(发布者发布信息后需要采取行动的人)
3.注册观察者
4.发布者发布信息
代码实现逻辑是用数组存贮订阅者, 发布者回调函数里面通知的方式是遍历订阅者数组,并将发布者内容传入

女神:(rose)

男生1:jack

男生2:tom
结构:1个发布者,2个观察者,关注的是一个状态

// 1.提供一个发布者(信息的发布者)
var rose = {user:[], //存储订阅者回调方法
//增加订阅者方法
addUser:function (fn) {
    if (typeof fn != "function") {
         throw "不支持!";
      }
    this.user.push(fn);
},
 //删除订阅者
 removeUser : function (fn) {
     for (var i = 0; i < this.user.length; i++) {
         if(this.user[i] == fn) {
            this.user.splice(i,1);
         }
     }
 },
// 发布者用来发布的状态的方法(例如肚子饿了)

 eat : function () {
   for (var i = 0; i < this.user.length; i++) {
        this.user[i]();
   }
 }
}
// 2.提供观察者(发布者发布信息后需要采取行动的人)
var jack = {eat_jack : function () {
     console.log("邀请女神吃麻辣烫!-jack");
   }
};
var tom = {eat_tom : function () {
    console.log("邀请女神吃火锅!-tom");
}
};
// 3.注册观察者
rose.addUser(jack.eat_jack);rose.addUser(tom.eat_tom);
// 4.发布者发布信息rose.eat();
console.log("----");//
 5.移出观察者rose.removeUser(jack.eat_jack);
rose.eat();