JavaScript 设计模式之享元模式

这篇具有很好参考价值的文章主要介绍了JavaScript 设计模式之享元模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

享元

将一部分共用的方法提取出来作为公用的模块

const Car = {
  getName: function () {
    return this.name
  },
  getPrice: function (price) {
    return price * 30
  }
}

const BMW = function (name, price) {
  this.name = name
  this.price = price
}
BMW.prototype = Car
const bmw = new BMW('BMW', 1000000)
console.log(bmw.getName()) // BMW
console.log(bmw.getPrice(1000000)) // 3000000

const Benz = function (name, price) {
  this.name = name
  this.price = price
}
Benz.prototype = Car
const benz = new Benz('Benz', 2000000)
console.log(benz.getName()) // Benz
console.log(benz.getPrice(2000000)) // 6000000

享元模式的应用目的是为了提高程序的执行效率与系统的性能。因此在大型系统开发中应用是比较广泛的,有时可以发生质的改变。它可以避免程序中的数据重复。有时系统内存在大量对象,会造成大量存占用,所以应用享元模式来减少内存消耗是很有必要的。

模板方法

假使我们有如下的样式

.panel {
  width: 200px;
  min-height: 50px;
  box-shadow: 0 0 10px rgba(0, 0, 0, .5);
  padding: 10px;
  margin: auto
}

.btn-content {
  display: flex;
  justify-content: space-around;
}
.btn-content.right{
  flex-direction: row-reverse;
}

创建一个弹窗的基类


const Alert = function (data) {
  if (!data) return
  this.content = data.content
  this.panel = document.createElement('div')
  this.contentNode = document.createElement('p')
  this.confirmBtn = document.createElement('span')
  this.closeBtn = document.createElement('b')
  this.footerBtn = document.createElement('div')
  this.footerBtn.className = 'btn-content'
  this.panel.className = 'panel'
  this.confirmBtn.className = 'btn-confirm'
  this.closeBtn.className = 'btn-close'
  this.confirmBtn.innerHTML = data.confirm || '确认'
  this.closeBtn.innerHTML = data.close || '关闭'
  this.contentNode.innerHTML = data.content || ''
  this.success = data.success || function () { }
  this.cancel = data.cancel || function () { }
}


Alert.prototype = {
  init: function () {
    this.panel.appendChild(this.contentNode)
    this.footerBtn.appendChild(this.confirmBtn)
    this.footerBtn.appendChild(this.closeBtn)
    this.panel.appendChild(this.footerBtn)
    document.body.appendChild(this.panel)
    this.bindEvent()
    this.show()
  },
  bindEvent: function () {
    this.confirmBtn.onclick = () => {
      this.success()
      this.hide()
    }
    this.closeBtn.onclick = () => {
      this.cancel()
      this.hide()
    }
  },
  show: function () {
    this.panel.style.display = 'block'
  },
  hide: function () {
    this.panel.style.display = 'none'
  }
}

基类主要用来实现一些常规的样式布局

定义一个标准的提示框


const TitleAlert = function (data) {
  Alert.call(this, data)
  this.title = data.title
  this.titleDom = document.createElement('h3')
  this.titleDom.style.textAlign = 'center'
  this.titleDom.innerHTML = this.title
  this.panel.className += ' title-panel'
}
TitleAlert.prototype = new Alert
TitleAlert.prototype.init = function () {
  this.panel.insertBefore(this.titleDom, this.panel.firstChild)
  Alert.prototype.init.call(this)
}

确认按钮位置在左/右


const LeftAlert = function (data) {
  TitleAlert.call(this, data)
  this.panel.className += ' left-panel'
  this.footerBtn.className += ' left'
}
LeftAlert.prototype = new Alert
LeftAlert.prototype.init = function () {
  TitleAlert.prototype.init.call(this)
}

const RightAlert = function (data) {
  TitleAlert.call(this, data)
  this.panel.className += ' right-panel'
  this.footerBtn.className += ' right'
}
RightAlert.prototype = new Alert
RightAlert.prototype.init = function () {
  TitleAlert.prototype.init.call(this)
}

使用

new LeftAlert({
  title: '提示',
  content: '这是一个自定义的右上角弹窗',
  btnText: '确定',
  success: function () {
    console.log('点击了确定按钮');
  },
  cancel: function () {
    console.log('点击了取消按钮');
  }
}).init();

效果

JavaScript 设计模式之享元模式,JavaScript设计模式,javascript,设计模式,享元模式

模板方法的核心在于对方法的重用,它将核心方法封装在基类中,让子类继承基类的方法,实现基类方法的共享,达到方法共用。文章来源地址https://www.toymoban.com/news/detail-835483.html

到了这里,关于JavaScript 设计模式之享元模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • javascript设计模式-门面和享元

    它的作用有两个,一个是简化类的接口,另一个是消除类与使用它的客户代码之间的耦合。比如基于GUI的操作系统就是计算机的数据和功能的一个门面,每次点击等操作实际上是在跟一个门面打交道,间接地执行一些幕后的命令。 如今的WEB应用程序开发要求必须尽量提高编程

    2024年01月24日
    浏览(12)
  • 设计模式之享元模式【结构型模式】

    设计模式之享元模式【结构型模式】

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博

    2024年01月25日
    浏览(17)
  • 设计模式(十二):结构型之享元模式

    设计模式(十二):结构型之享元模式

    设计模式系列文章 设计模式(一):创建型之单例模式 设计模式(二、三):创建型之工厂方法和抽象工厂模式 设计模式(四):创建型之原型模式 设计模式(五):创建型之建造者模式 设计模式(六):结构型之代理模式 设计模式(七):结构型之适配器模式 设计模式(八):结构型之装

    2024年02月08日
    浏览(10)
  • 【结构型设计模式】C#设计模式之享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,旨在通过尽可能共享对象来减少内存使用和提高性能。它将对象分为两种类型:内部状态(Intrinsic State)和外部状态(Extrinsic State)。内部状态是可以共享的,而外部状态是独立于享元对象的,并且在使用时需要注入。 使用

    2024年02月13日
    浏览(18)
  • 【Java 设计模式】结构型之享元模式

    享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在减少对象的数量以节省内存和提高性能。享元模式通过共享大量相似对象的状态,使得这些对象可以共享,而不需要在每个对象中都存储相同的数据。在本文中,我们将深入研究Java中享元模式的定义、结构、使用场景

    2024年01月22日
    浏览(18)
  • 学习设计模式之享元模式,但是宝可梦

    学习设计模式之享元模式,但是宝可梦

    作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 享元模式很好理解,它主要是为了减少创建对象的数量,属于结构型设计模式 目的:减少创建对象的次数 方法:复用对象 何时使用:

    2024年02月11日
    浏览(11)
  • javaScript---设计模式-设计模式概论

    (1)帮助我们组织模块(2)帮助我们设计沟通(3)提高代码质量 开闭原则:对扩展开放,对修改关闭 单一职责原则:一个模块只做一件事情 依赖倒置原则:上层模块不要依赖具体的下层模块,而应该依赖于抽象 接口隔离原则:接口功能单一,能力单一,细化接口,接口功

    2024年02月03日
    浏览(27)
  • JavaScript 设计模式之代理模式

    其实这种模式在现在很多地方也都有使用到,如 Vue3 中的数据相应原理就是使用的 es6 中的 Proxy 代理及 Reflect 反射的方式来处理数据响应式 我们日常在使用数据请求时,也会用到一些代理的方式,比如在请求不同的域名,端口等会出现跨域的情况,这时就需要用到代理去获

    2024年02月19日
    浏览(11)
  • JavaScript 设计模式之外观模式

    我们为啥要使用外观模式呢,其实我们在使用各种 js 库的时候常常会看到很多的外观者模式,也正是这些库的大量使用,所以使得兼容性更广泛,通过外观者模式来封装多个功能,简化底层操作方法 在我们写方法时,通常会传递参数的形式来传递数据 但是我们更应该这样来

    2024年02月20日
    浏览(14)
  • JavaScript 设计模式之组合模式

    JavaScript 设计模式之组合模式

    在我们日常中肯呢个会将一个表单用这种模式来创建 先写一个基类,再继承该基类 首先我们创建一个基类 定义 接下来创建一个容器 注意,这里的 show 方法就是用来将所有的 dom 追加到页面上 下面创建一系列的 form 相关 item 及一些dom 使用  假使页面中存在 dom  js 效果 组合模

    2024年02月22日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包