概念
设计模式就是根据特定问题,给出的简洁而优化的解决方案
单例模式
模式的目的:一个构造函数只能new出一个对象。只要让new出来的所有的对象,在堆中的地址相同。那么new出来的对象就都一样了。
简单实现代码:
let Person=(function (){
class A{
constructor(name){
this.name=name
}
}
let instance=null;
return function (){
// if(!instance){
// instance=new A('wsy') //调用构造函数时,传一个参数,根据具体需求决定
// }
// return instance; 注释部分和下面的三元表达式实现需求相同
return !instance?instance=new A('wsy'):instance;
}
})()
let ex1=Person(); //创建一个对象
let ex2=Person(); //再创建一个对象
console.log(ex1);
console.log(ex1===ex2); //执行得到的结果是true,就是这两个对象一模一样,改变任何一个,另一个都会跟着改变
组合模式
将多个构造函数,安装统一的按钮,启动这个按钮,所有的函数都会执行
class Compose{//组合构造函数
constructor (){
this.composeArr=[] //创建组合每个部分的实例的容器
}
add(instance){ //instance实例
this.composeArr.push(instance)//通过add方法,将要组合的部分的实例,通过add方法添加进数组
}
init(){//调用init方法,遍历实例数组中的每个实例,让他们各自执行对应的代码
this.composeArr.forEach(item=>item.init())
}
}
class A{ //部分一,如果要更多的部分,写法和这个部分相似
constructor (){
this.name='洗衣机'
}
init(){
console.log(`${this.name}开始工作了`); //启动后,要执行的代码
}
}
let ex=new Compose();
ex.add(new A()); 组合中增加的A的实例
console.log(ex);
ex.init() //启动组合,组合中的A的示例会执行init方法
观察者模式
就是有个监督者监督着某些对象,这些对象的状态一旦发生改变,监督者本身就对执行某些行为
class Student{
constructor(name){
this.name=name;
this.state='正在学习';
this.observerarr=[];
}
changeState(newstate){ //只要状态改变,就通知观察者
this.state=newstate
this.notify() //状态改变了,立刻执行notify方法
}
addObserver(observer){ //新增观察者的方法
this.observerarr.push(observer)
}
notify(){ //只要实例的状态改变,就会执行这个notify,就是让每个观察者都执行qjz这个方法,至于qjz方法是什么,就要看观察者的qjz是怎么定义的
this.observerarr.forEach(item=>item.qjz(this.name,this.state))
}
}
class Teacher{ //观察者
constructor(name){
this.name=name;
}
qjz(xsname,xsstate){
console.log(`${this.name}要叫${xsname}的家长,因为他${xsstate}!`);
}
}
let wsy=new Student('wsy')
let teacher_fan=new Teacher('fan')
wsy.addObserver(teacher_fan)
wsy.changeState('上课睡觉打呼噜')