美文网首页
js设计模式

js设计模式

作者: 易路先登 | 来源:发表于2021-08-19 12:28 被阅读0次

    引言:以策略模式举例说明学习设计模式的必要性
    设计模式:一个屋子如果要持续往里扔东西的话,为什么不先摆几个柜子呢

    
            //策略模式
            //开放原则  封闭原则
            let toolObject = {
                html(){
                    //取出对应的值然后使用InnerHTML给对应的节点赋值
                    /*5行*/
                },
                bind(){
                    //替换对应的属性
                    /*5行*/
                },
                model(){
                    //绑定值,并且给对应元素绑定Input事件
                    /*10行*/
                }
            }
    
    
            let dir = ''
            function compile(){
                let dir = 'xxx'
                toolObject[div.slice(2)]()
                // if(dir==='v-html'){
                //     //取出对应的值然后使用InnerHTML给对应的节点赋值
                //     /*5行*/
                // }else if(dir==='v-bind'){
                //     //替换对应的属性
                //     /*5行*/
                // }else if(dir==='v-model'){
                //     //绑定值,并且给对应元素绑定Input事件
                //     /*10行*/
                // }else if(dir==='v-if'){
    
                // }
            }
    

    单例模式

    //单例模式---> 一个类只允许有一个实例 
           //ES6实现方式
        //    class MyRedux{
        //        static storeInstance
        //        static createStore(){
        //             if(MyRedux.storeInstance){
        //                 return MyRedux.storeInstance
        //             }else{
        //                 return MyRedux.storeInstance = new MyRedux()
        //             }
        //        }
        //    }
        //    let firstStor = MyRedux.createStore()
        //    let secondStor = MyRedux.createStore()
        //    console.log(firstStor===secondStor)
        //es5实现单例模式
            var MyRedux = (function MyRedux(){
                var instance;
                return function(){
                    if(instance){
                        return instance
                    }else{
                        return instance = {
                            defaultState:{
                                username:'zs'
                            }
                        }
                    }
                }
            })()
           
            let first = new MyRedux()
            let second = new MyRedux()
            console.log(first===second)
    

    发布订阅--实现一个redux

    发布订阅模式
    也称作观察者模式,定义了对象间的一种一对多的依赖关系,
    当一个对象的状态发 生改变时,所有依赖于它的对象都将得到通知

    
            //createStor dispatch subscribe
            class MyRedux{
                constructor(){
                    this.container = []
                }
                getState(){
                    return this.state
                }
                subscribe(fn){//订阅函数,订阅一些更新逻辑
                    this.container.push(fn)
                }
                notify(value){
                    this.container.forEach((fnItem)=>{
                        fnItem(value)
                    })
                }
                dispatch(action){
                    this.state = this.reducer(this.state,action)
                    //this.state如果发生了改变,那么就发布  immer
                    this.notify(this.state)
                }
                static instanceStor
                static createStor(reducer){
                    if(MyRedux.instanceStor){
                        return MyRedux.instanceStor
                    }else{
                        let store = new MyRedux()
                        store.state = reducer(undefined,{})
                        store.reducer = reducer
                        return MyRedux.instanceStor = store
                    }
                }
            }
            const defaultState = {
                username:'zhangsan'
            }
            let stor = MyRedux.createStor((state=defaultState,action)=>{
                switch(action.type){
                    case 'changename':
                        return {...state,username:action.value}
                    default:
                        return {...state}
                }
            })
            stor.subscribe((value)=>{
                console.log(value,'仓库值更新后同步刷新组件视图')
            })
            console.log(stor.getState().username)
            stor.dispatch({
                type:'changename',
                value:'lisi'
            })
            console.log(stor.getState().username)
    

    实现一个koa的中间件

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
            html,body,#container{
                width:100%;
                height:100%;
            }
        </style>
    </head>
    <body>
        <div id="container">
    
        </div>
        <script>
           
           class MyKoa{
               constructor(){
                   this.container = []
               }
               use(fn){
                   this.container.push(fn)
               }
               compose(ctx){
                   //dispatch(0)
                   //let fn = this.container[0]
                   let that = this
                   dispatch(0)
                   function dispatch(index){
                    let fn = that.container[index]
                    if(typeof fn==='function'){
                        fn(ctx,function next(){
                            dispatch(index+1)
                        })
                    }
                   }
               }
               createApp(){
                   this.compose({req:'req',res:'res'})
                   return {}
               }
           }
    
           let app = new MyKoa()
           app.use(async (ctx,next)=>{
                console.log('11111')
                await next()
                console.log(ctx.username)
                console.log('22222')
           })
           app.use(async (ctx,next)=>{
                console.log('33333')
                ctx.username = 'zs'
                await next()
                console.log('444444')
           })
           app.createApp()
        </script>
    </body>
    </html>
    

    相关文章

      网友评论

          本文标题:js设计模式

          本文链接:https://www.haomeiwen.com/subject/wkgobltx.html