设计模式,单例模式,组合模式,观察者模式

概念

设计模式就是根据特定问题,给出的简洁而优化的解决方案

单例模式

模式的目的:一个构造函数只能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('上课睡觉打呼噜')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值