Javascript 设计模式
来源:     阅读:520
依创模板店
发布于 2020-11-08 00:58
查看主页

创立型模式

行为模式

工厂模式

形容: 通过不同的type new不同的类, 只要要和工厂打交道
应用场景: 封装

// 笼统工厂模式 通过不同的type new不同的类class Button {    constructor(color,text) {        this.color = color;        this.text = text;    }    click(fn) {        console.log('click')        fn && fn()    }}class PrimaryBtn extends Button { // 按钮对象    constructor(text) {        super('blue',text)    }}class WarningBtn extends Button { // 按钮对象    constructor(text) {        super('yellow',text)    }}class ButtonFactory {    static types = {}    static getButton(type,text) {        let cls = this.types[type];        if (cls) {            return new cls(text)        } else {            return null        }    }    static registerButton(type,Button) {        this.types[type] = Button;    }} // 注册才能使用ButtonFactory.registerButton('primary',PrimaryBtn)ButtonFactory.registerButton('warning',WarningBtn)// 演示let primary = ButtonFactory.getButton('primary','搜索')console.log(primary);

建造者模式

形容: 通过一个中介者对象控制其余的对象
应用场景: 封装DOM事件绑定

// Builder 建造者模式。根据需要创立对象的属性class BuildHouse {    constructor(name) {        this.name = name    }    buildWindow() {        this.window = true;        return this;    }    buildBalcony() {        this.balcony= true        return this;    }}new BuildHouse('Mike').buildWindow().buildBalcony() // 有窗户有阳台new BuildHouse('Amy').buildWindow() // 只有窗户

中介者模式

形容: 根据需要创立对象的属性
应用场景: 创立自己设置对象

let btn = document.querySelector('#btn')let submitBtn = document.querySelector('#btnSubmit')let input = document.querySelector('input')let eventManager = { // 通过这个控制事件    btnClick() { },    inputChange() {},    submitClick() {}}btn.onclick = eventManager.btnClicksubmitBtn.onclick = eventManager.submitClickinput.onchange = eventManager.inputChange

职责链模式

形容: 当这个事件执行完毕接着执行下一个事件
应用场景: 改善回调地狱

// 职责链class Chain {    constructor() {        this._chainItem = [];        this._index = -1;    }    setNext(fn) {        this._chainItem.push(fn);        return this;    }    toNext(...args) {      this._index++;      if (this._index !== this._chainItem.length) {        return this._chainItem[this._index](...args);      }    }    start(...args) {        return this.toNext(...args)    }  }  // 事件-------  // 打8折  function discount8(array) {    let result = array.map(item=>Math.floor(item*0.8));    return queryChain.toNext(result);  }  // 加单位  function addUnit(array) {    let result = array.map(item=>item+'元')    return result;  }    // 演示  let queryChain = new Chain();  queryChain.setNext(discount8).setNext(addUnit);  // 打完8折加价格单位  queryChain.start([199,499,758,50]) // ["159元", "399元", "606元", "40元"]

观察者模式

形容: 每个对象都可以向观察者订阅一个事件,观察者发布一个事件把订阅该事件的所有事件运行
应用场景: 下拉框change时触发函数。可以改这个些函数订阅change事件,下拉框change时发布change事件。

// 观察者模式class Observer {    constructor(name='') {      this.name = name       this._subscribes = {} // 保存订阅的事件    }    // 订阅事件    // @param{String} event 事件名称    // @param{Function} fn 执行的函数    subscribe(event,fn) {       let subscribes = this._subscribes[event];      if (subscribes) {        subscribes.push(fn)      } else {        this._subscribes[event] = [fn]      }    }    // 发布订阅事件    // @param{String} event 事件名称    // @param{*} args 传递给执行事件的参数    publish(event,...args) {       let subscribes = this._subscribes[event] || [];      subscribes.forEach(fn=>{        fn(...args);      })    }    // 删除订阅事件    // @param{String}event 事件名称    // @param{Function} fn 有名称的函数    // @return{Function} 返回被删除的函数    remove(event,fn) {      let subscribes = this._subscribes[event] || [];       let result = null;      subscribes.forEach((item,itemI)=>{        if (Object.is(fn,item)) {          result = subscribes.splice(itemI,1)        }      })      return result;    }  }  // 演示let fn1 = (param) => { console.log(param + 1)}let fn2 = (param) => { console.log(param + 2)}let selectObserver = new Observer('select');selectObserver.subscribe('change', fn1)selectObserver.subscribe('change', fn2)selectObserver.publish('change','change')selectObserver.remove('change',fn1)
免责声明:本文为用户发表,不代表网站立场,仅供参考,不构成引导等用途。 系统环境 windows
相关推荐
Jackrabbit Oak 1.2.30 发布,可扩展、高性能分层存储库
淘宝一面:“说一下 Spring Boot 自动装配原理呗?”
deepin通过调整xrandr屏幕分辨率,屏幕内容向下偏移超出显示器的处理方案
Google Cloud 搭建ftp服务
Ubuntu第三方软件仓库源(国内源)
首页
搜索
订单
购物车
我的