首页 > 其他 > 详细

设计模式 --kkb

时间:2019-12-11 16:09:39      阅读:88      评论:0      收藏:0      [点我收藏+]

设计模式概念

前人总结的代码最佳实践。

设计模式是一套被反复使用、多人知晓的、经过分类的、代码设计经验的总结。

 

工程师基础(内力,决定走多远)

算法和数据结构、设计模式、网络协议(TCP/IP 通信 缓存)、操作系统、计算机组成、数据库(和数据结构也息息相关,红黑树)、编译原理(vue的compile模块)

 

订阅/发布模式(观察者模式)

class Event{
  constructor(){
    this.callbacks = {}
  }
  $on(name, fn){ // 监听
    // if(!this.callbacks[name]){
    //   this.callbacks[name] = []
    // }
    // this.callbacks[name].push(fn)

    // 上述代码的简写
    (this.callbacks[name] || (this.callbacks[name]=[])).push(fn)
  }
  $emit(name, arg){
    const cbs = this.callbacks[name]
    if(cbs){
      cbs.forEach(c=>{
        c.call(this, arg)
      })
    }
  }
  $off(name){
    this.callbacks[name] = null
  }
}

let event = new Event()
event.$on(‘event1‘, arg => {
  console.log(‘event1触发‘, arg)
})
event.$on(‘event1‘, arg => {
  console.log(‘又一个event1触发‘, arg)
})
event.$on(‘event2‘, arg => {
  console.log(‘event2触发‘, arg)
})

event.$emit(‘event1‘, ‘myArg‘)
event.$emit(‘event2‘, ‘myArg2‘)
event.$off(‘event1‘)
event.$emit(‘event1‘, ‘myArg‘)

 

单例模式

定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。实现的方法为先判断实例存在与否,如果存在则直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。

适用场景:一个单一对象。比如:弹窗,无论点击多少次,弹窗只应该被创建一次,实现起来也很简单,用一个变量缓存即可

 

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .modal{
      position: fixed;
      border: 2px solid red;
      width: 300px;
      height: 300px;
      top: 30%;
      left: 50%;
      margin-left: -150px;
      text-align: center;
      padding: 20px;
    }
  </style>
</head>
<body>
  <div id="model-btn">点我</div>

  <script>
    function getSingle(fn){
      // 使用闭包存储期望的单例实例
      // 把函数fn变成单例
      let result
      return function(){
        return result || (result=fn.apply(this, arguments))
      }
    }
    function createModalLayer(){
      console.log(新建弹窗)
      // 期望弹窗是全局唯一的
      let div = document.createElement(div)
      div.innerHTML = 我是一个弹窗
      div.className = modal
      div.style.display = none
      div.addEventListener(click, function(){
        div.style.display = none
      }, false)
      document.body.appendChild(div)
      return div
    }

    // 只需要对原本的函数包一层,就变成单例了
    createModalLayer = getSingle(createModalLayer)

    document.getElementById(model-btn).addEventListener(click, function(){
      // 新建一个弹窗
      const modalLayer = createModalLayer()
      // 修改弹窗的内容
      modalLayer.style.display = block
      modalLayer.innerHTML = 登录 + new Date()
    }, false)
  </script>
</body>
</html>

 

策略模式

// 判断绩效:绩效S为4倍工资,A为3倍工资,B为2倍工资

function calculate(level, salary){
  if(level===‘S‘){
    return salary*4
  }
  if(level===‘A‘){
    return salary*3
  }
  if(level===‘B‘){
    return salary*2
  }
  return salary
}

上述代码如果想加入新的条件,比如: SS绩效 5倍工资

就得多加一条 if 判断

if(level===‘SS‘){
  return salary*5
}

这种我们称为面条代码,不好维护而且阅读起来比较困难

 

将至改造成策略模式(策略 + 使用)

// 新的策略,就扩展这个对象---这里可以使用配置 {"S":4, "A":3, "B":2} ,也可以是接口返回
const policy = {
  ‘S‘: function(salary){
    return salary * 4
  },
  ‘A‘: function(salary){
    return salary * 3
  },
  ‘B‘: function(salary){
    return salary * 2
  }
}

// 使用层(业务层)
function calculate(level, salary){
  return policy[level] ? policy[level](salary) : salary
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

设计模式 --kkb

原文:https://www.cnblogs.com/haishen/p/12022568.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!