首页 > 其他分享 >js设计模式

js设计模式

时间:2023-02-15 17:47:42浏览次数:32  
标签:console name const js new 设计模式 class log

实体展现(系统本身)
工具(设计模式)
基础(组织模块, 设计沟通, 代码质量)

设计模式

  1. 创建型(创建元素)
  2. 工厂: 生产同类型商品
  3. 建造者: 独立生产商品
  4. 单例: vue-router
  5. 结构型(代码结构)
  6. 适配器: 适配已有方案
  7. 装饰器: 增强已有方案
  8. 代理模式: 集约流程
  9. 行为型(模块行为总结)
  10. 命令: 包裹传递命令
  11. 模板: 重编排, 易拓展
  12. 观察者: 模块间实时互通
  13. 职责链: 单向链执行

行为型(模块行为总结)

// 行为型
// 不同的对象之间划分责任和算法的抽象化

// 命令模式
// 请求以命令的形式包裹在对象中, 并传给调用对象
// 对于游戏角色的控制

// 接受者
class Receiver {
  execute() {
    console.log('角色开始奔跑');
  }
}

//触发者
class Operator {
  constructor(command) {
    this.command = command
  }
  run() {
    console.log('请给我爬');
    this.command.execute()
  }
}

// 指令器
class Command {
  constructor(receiver) {
    this.receiver = receiver
  }
  execute() {
    console.log('执行命令');
    this.receiver.execute()
  }
}

const soldier = new Receiver()
const order = new Command(soldier)
const player = new Operator(order)
player.run()

// 模板模式
// 在模板中, 定义好每个方法的执行步骤. 方法本身关注于自己的事情
// 想要成功吃个鸡, 大概分几步
class Device {
  constructor(executePipeLine) {
    // executePipeLine-
  }
  powerOn() {
    console.log('打开电源');
  }
  login() {
    console.log('登录账号');
  }
  clickIcon() {
    console.log('点击开始游戏');
  }
  enterGame() {
    console.log('进入战场');
  }

  play() {
    this.powerOn()
    this.login()
    this.clickIcon()
    this.enterGame()
  }
}


// 观察者模式
// 当一个属性发生状态改变时, 观察者会连续引发所有的相关状态改变
// 通过智能家居一键开始游戏
class MediaCenter {
  constructor() {
    this.state = ''
    this.observers = []
  }
  attach(observer) {
    this.observers.push(observer)
  }
  getState() {
    return this.state
  }
  setState(state) {
    this.state = state
    this.notifyAllobservers()
  }
  notifyAllobservers() {
    this.observers.forEach(ob => {
      ob.update()
    })
  }
}

class Observer {
  constructor(name, center) {
    this.name = name
    this.center = center
    this.center.attach(this)
  }
  update() {
    console.log(`${this.name} update, state: ${this.center.getState()}`);
  }
}

const center = new MediaCenter()
const ps = new Observer('ps', center)
const tv = new Observer('tv', center)

center.setState('on')

// 职责链
// 1. 链式调用 2. 职责独立 3. 顺序执行
// 成年高质量男性向打个游戏, 在家里需要过几关
class Action {
  constructor(name) {
    this.name = name
    this.nextAction = null
  }
  setNextAction(action) {
    this.nextAction = action
  }
  handle() {
    console.log(`${this.name}请审批, 是否可以打游戏`);
    if(this.nextAction !== null) {
      this.nextAction.handle()
    }
  }
}

const dad = new Action('ba')
const mom = new Action('ma')
const wife = new Action('bapo')

dad.setNextAction(mom)
mom.setNextAction(wife)

dad.handle()

// 模式场景
// 发出指令, 中间层传递命令本身, 命令中包含执行对象 - 命令模式
// 通过模板定义执行顺序, 做独立操作 - 模板模式
// 通过观察者, 可以让被观察值统一发生变化, 触发相应依赖值的统一更新 - 观察者模式
// 独立职责的单元通过链式执行, 逐步操作流程 - 职责链

// 实际应用
// 1. 提交表单进行表单逐行校验, 链式调用validate, 以此执行 => 职责链
// 2. echart准备工作: canvas, config, init, draw(). 规划顺序执行 => 模板模式
// 3. 调度器在接收到一组新的数据时候, 解析数据, 并且根据数据类型包裹在对象中传递到下级helper, helper
// 再去执行相应操作 => 命令模式
// 4. 输入框输入的值去判断下拉框显示与否 => 观察input设置show => 观察者模式

结构型(代码结构)

// 结构型
// 功能: 优化结构的实现方式

// 适配器模式 - adapter
// 适配独立模块, 保证模块间的独立解耦且连接兼容
// 需求: 买了一个港行PS, 插座是国标
//
class HKDevice {
  getPlug() {
    return '港行双圆柱插头'
  }
}

class Target {
  constructor() {
    this.plug = new HKDevice()
  }
  getPlug() {
    return this.plug.getPlug() + '港行双圆柱转换器'
  }
}

const target = new Target()
target.getPlug()

// 装饰器模式
// 动态将责任附加到对象上
// 设备升级
class Device {
  create() {
    console.log('PlayStation4');
  }
}

class Phone {
  create() {
    console.log('iphone18');
  }
}

class Decorator {
  constructor(device) {
    this.device = device
  }
  create() {
    this.device.create()
    this.update(this.device)
  }
  update() {
    console.log(this.device + 'pro');
  }
}

const device = new Device()
device.create()

const newDevice = new Decorator(device)
newDevice.create()

// 代理模式
// 使用代理人来替代原始对象
// 游戏防沉迷
class Game {
  play() {
    return 'playing'
  }
}

class Player {
  constructor(age) {
    this.age = age
  }
}

class GameProxy {
  constructor(player) {
    this.player = player
  }
  play() {
    return (this.player.age < 16) ? 'too young to play' : new Game().play()
  }
}

const player = new Player(18)
const game = new GameProxy(player)

game.play()

// 模式场景
// 中间转换参数, 保持模块间独立的时候 - 适配器模式
// 附着于多个组件上, 批量动态赋予功能的时候 - 装饰器模式
// 将代理对象与调用对象分离, 不直接调用目标对象 - 代理模式

// 实际应用
// 1. 两个模块: 筛选器和表格, 需要做一个联动. 但筛选器的数据不能直接传入表格, 需要做数据结构转换
// => 模块之间独立, 需要做数据结构转换 => 适配器
// 2. 目前有按钮, title, icon 三个组件. 希望开发一个模块, 让三个组件同时具备相同功能 => 套一层装甲
// 有统一的能力提升, 且可以动态添加功能进行拓展 => 装饰器
// 3. ul中多个li, 每个li上的点击事件 => 利用冒泡做委托, 事件绑定在ul上 => 代理

创建型(创建元素)

// 元素创建型
// 功能: 创建元素
// 目的: 规范创建步骤
//
// 工厂模式
// 隐藏创建过程, 暴露共同接口
// 需求: 游戏商店里下载初始化游戏, 并且可以运行游戏
class Stop {
  create(name) {
    return new Game(name)
  }
}

class Game {
  constructor(name) {
    this.name = name
  }
  init() {
    console.log('init')
  }
  run() {
    console.log('run')
  }
}

const show = new Shop()
const pubg = new Game('pubg')

pubg.init()
pubg.run()
// 创建商品时,快速生产了游戏

// 建造者
// 拆分简单模块, 独立执行 => 注重过程与搭配
// 需求: 优惠套餐单元, 商品 + 皮肤 进行打折售卖
//
class Product {
  constructor(name) {
    this.name = name
  }
  init() {
    console.log('Product init')
  }
}

class Skin {
  constructor(name) {
    this.name = name
  }
  init() {
    console.log('Skin init')
  }
}

class Shop {
  constructor() {
    this.package = ''
  }
  create(name) {
    this.package = new PackageBuilder(name)
  }
  getGamePackage() {
    return this.package.getPackage()
  }
}

class PackageBuilder {
  constructor(name) {
    this.game = new Product(name)
    this.skin = new Skin(name)
  }
  getPackage() {
    return this.game.init() + this.skin.init()
  }
}
// 每个模块独立解耦, 而建造者负责创建串联正题系统

// 单例模式
// 全局只有一个实例
class PlayStation {
  constructor() {
    this.state = 'off'
  }
  play() {
    if (this.state === 'on') {
      console.log('别闹, 已经在happy了')
      return
    }
    this.state = 'on'
    console.log('开始happy')
  }
  shutdown() {
    if (this.state === 'off') {
      console.log('已经关闭')
      return
    }
    this.state = 'off'
    console.log('=已经关机, 请放心')
  }
  // static getInstance() {
  //   return (() => {
  //     if (PlayStation.instance) {
  //       PlayStation.instance = new PlayStation()
  //     }
  //     return PlayStation.instance
  //   })()
  // }
}

// main.js
PlayStation.instance = undefined
PlayStation.getInstance = () => {
  return (() => {
    if (PlayStation.instance) {
      PlayStation.instance = new PlayStation()
    }
    return PlayStation.instance
  })()
}

const ps1 = PlayStation.getInstance()
ps1.play()

const ps2 = PlayStation.getInstance()
ps2.shutdown()

// 全局只要一个实例, 不能乱

// 模式场景
// 1. 批量生产同类型应用来满足频繁使用同一种类型需求时 - 工厂模式
// 2. 当我们需要模块拆分一个大模块, 同时使模块间独立解耦分工 - 建造者模式
// 3. 全局只需要一个实例, 注重统一一体化 - 单例

// 实际应用
// Button Producer: 生产不同类型的按钮 => 生产多个本质相同, 利用传参区分不同属性的元素 => 工厂
// 全局应用 router store => 只需要一个实例 => 单例
// 页头组件Header: 包含了title, button, breadcum => 生产多重不同类型的元素 => 建造者

标签:console,name,const,js,new,设计模式,class,log
From: https://www.cnblogs.com/DTCLOUD/p/17123622.html

相关文章

  • vue-day03——js中的循环、key值在循环的作用、数组,对象的检测与更新、input时间、v-m
    目录一、js的几种循环方式1.1v-for可以循环的变量1.2js的循环方式二、key值的解释三、数组,对象的检测与更新四、input事件五、v-model双向数据绑定六、过滤案例七、事件......
  • 给按钮添加js代码,点击按钮后复制页面上的某个文本内容
    你可以通过JavaScript的document.execCommand()方法,结合使用document.createRange()和window.getSelection()方法来实现复制文本的功能。下面是一个例子,当用户点......
  • @JsonInclude注解
    @JsonInclude注解是jackSon中最常用的注解之一,是为实体类在接口序列化返回值时增加规则的注解例如,一个接口需要过滤掉返回值为null的字段,即值为null的字段不返回,可以在实......
  • 原生的js分页
    functionpagePagings(option){lethtmlStr='';console.log(option.current,option.total,option.btnNums);//当前页letcurrent=option.current|......
  • js设计原则
    开闭原则:开-拓展;闭-修改单一职责原则:岗位职责单一,互不重叠依赖倒置原则:上层不应依赖下层实现接口隔离原则(接口)里氏替换原则:子类可以拓展,不能改变OC......
  • Vue Grid Layout -️ 适用Vue.js的栅格布局系统(自定义页面)
    官网:https://jbaysolutions.github.io/vue-grid-layout/zh/github:https://github.com/jbaysolutions/vue-grid-layout 一个类似于Gridster的栅格布局系统,适用于Vue.j......
  • javascript放在head和body的区别以及js文件加载带来的阻塞解决
    今天在看到菜鸟教程中的HTML中的Javascript脚本代码必须位于<script>与</script>标签之间。Javascript脚本代码可被放置在HTML页面的<body>和<head>部分中......
  • Go 工程化 - JSON 使用技巧
    概述在 Go快速入门指南-JSON 讲解了 JSON 的常用方法,但是除此之外,JSON 还有一些鲜为人知的使用技巧,可以简洁地组合和忽略结构体字段,避免了重新定义结构体和内嵌......
  • js 简单算法学习
    http://liting.ltd/#/algorithm_js/翻转字符串转算法http://liting.ltd/#/js简单算法学习......
  • json.dumps()
    json.dumps():将python对象编码成Json字符串importjson#将字典类型数据转换成json字符串data={'name':'winnie','age':20,}json_str=json.dumps(data)pr......