美文网首页
几种常见的设计模式

几种常见的设计模式

作者: 王二麻子88 | 来源:发表于2020-11-19 20:54 被阅读0次

学习程序设计模式

1. 单例设计模式

过于简单无脑, 就是依靠类中的静态属性

2. 观察者模式 (Observe)

观察者实际上是Map集合的巧用

class Observe {
  constructor() {
    this.evenList = {};
  }
  addEvent(type, callBack) {
    if (!this.evenList[type]) {
      this.evenList[type] = []
    }
    this.evenList[type].push(callBack);
  }
  removeEvent(type, callBack) {
    if (!this.evenList[type]) {
      throw new Error("no bind such "+ type + " event")
    } else {
      if (!callBack) {
        this.evenList[type] = [];
      }
      this.evenList[type].forEach((item, index) => {
        if (item === callBack) {
          this.evenList[type].splice(index, 1);
        }
      })
    }
  }
  emit(type) {
    if (this.evenList[type]) {
      this.evenList[type].forEach(item => item())
    }
  }
}

const o1 = new Observe();
o1.addEvent("left", function () {
  console.log("left1");
});
o1.addEvent("left", left2);
function left2 () {
  console.log("left2");
}
o1.addEvent("left", function () {
  console.log("left3")
});
o1.addEvent("right", function () {
  console.log("right1");
});
o1.removeEvent("left", left2);
o1.emit("left");

3. 代理模式

对目标方法的进一层封装

// 代理模式

// 图片懒加载 --> 使用闭包防止变量污染, 返回 设置url 的方法对象
const myImage = (function(){
    const imgNode = document.createElement('img');
    document.body.appendChild(imgNode);
    return {
      setSrc: function(src) {
        imgNode.src =src
      }
    }
  }
)();

const proxyImage = (function() {
  const img = new Image;
  img.onload = function() {
    myImage.setSrc(this.src)
  };
  return {
    setSrc: function(src) {
      console.log('src', src);
      myImage.setSrc(src);
      img.src = src;
    }
  }
})();
// 在实际使用的过程中, 不直接使用目标函数或者方法, 而是使用代理对象-->由代理对象指定使用的方法
proxyImage.setSrc('http://webSize/websSizeImage.jpg');

4. 迭代器模式

关于虚拟指针位移的使用

const Iterator = function (obj) {
  let current = 0;
  let next = function () {
    current++;
  };
  let isFinish = function () {
    return !!(current > obj.length || current === obj.length)
  };
  const getCurrentItem = function () {
    return obj[current];
  };
  const getCurrent = function () {
    return current
  };
  const resetCurrent = function () {
    current = 0
  };
  return {
    next,
    isFinish,
    getCurrentItem,
    getCurrent,
    resetCurrent
  }
};

let iteratorArray1 = [1, 2, 3, 4, 5];
let iteratorArray2 = [1, 2, 3, 4, 5];
let iteratorArray3 = [2, 2, 3, 5, 4];
function compara(Array1, Array2) {

  console.log("index: "+ Array1.getCurrent());
  console.log("index: "+ Array2.getCurrent());
  while (!Array1.isFinish() && !Array2.isFinish()) {
    console.log(Array1.getCurrentItem());
    console.log(Array2.getCurrentItem());
    console.log("index: "+ Array1.getCurrent());
    console.log("index: "+ Array2.getCurrent());
    if (Array1.getCurrentItem() !== Array2.getCurrentItem()) {
      // throw new Error("not quail value");
      Array1.resetCurrent();
      Array2.resetCurrent();
      return false;
    }
    Array1.next();
    Array2.next();
  }
  Array1.resetCurrent();
  Array2.resetCurrent();
  return true
}
iteratorArray1 = Iterator(iteratorArray1);
iteratorArray2 = Iterator(iteratorArray2);
iteratorArray3 = Iterator(iteratorArray3);
console.log(compara(iteratorArray1, iteratorArray2));  // true
console.log(compara(iteratorArray1, iteratorArray3));  // false

5. 职责链模式

类似于实现 jQuery的链式调用

function currentEnvCanUseHTML5Form() {
  return true
}
function runHTML5Form(obj) {
  console.log("runHTML5Form");
  console.log(obj);
  return "runHTML5Form";
}
function currentEnvCanUseFlash() {
  return false
}
function runFlash(obj) {
  console.log("runFlash");
  console.log(obj);
  return "runFlash"
}

function useHTML5Form(obj) {
  if (currentEnvCanUseHTML5Form()) {
    return runHTML5Form(obj)
  }
  return "next"
}

function useFlash(obj) {
  if (currentEnvCanUseFlash()) {
    // 当前支持 flash
    return runFlash(obj)
  }
  return "next"
}


function createChain() {
  Function.prototype.chain = function (nextFn) {
    const that = this;
    return function () {
      let result = that.apply(this, arguments);
      if (result === "next") {
        return nextFn.apply(this, arguments)
      }
      return ""
    }
  }
}
createChain();
var upload = useFlash.chain(useHTML5Form);

upload({info: "info"});

6. 策略模式

对多重判断从主逻辑中的脱离

const strategies = {
  "2": function (salary) {
    return salary * 2
  },
  "3": function (salary) {
    return salary * 3
  },
  "4": function (salary) {
    return salary * 4
  }
};

const calculateBonus = function (level, salary) {
  return strategies[level](salary);
};

console.log(calculateBonus("2", 1200));

番外

1. 关于闭包避免全局污染变量

var user = (function() {
  var name = "wang";
  return {
    getName: function() {
      console.log(name);
      return name
    }
  }
})();
console.log(user.getName());

相关文章

  • Java的常用设计模式详解

    引言 说起设计模式,很多编程语言的设计模式大同小异,而且设计模式很多,这里介绍一下java的几种常见的设计模式,其...

  • 常见的几种设计模式

    iOS开发学习中,经常弄不清楚iOS的开发模式,今天我们就来进行简单的总结和探讨~ 一 、代理模式 应用场景:当一...

  • 几种常见的设计模式

    学习程序设计模式 1. 单例设计模式 过于简单无脑, 就是依靠类中的静态属性 2. 观察者模式 (Observe)...

  • iOS设计模式 都在这里哈

    这里呢 主要向大家介绍一下三种设计模式中几种常见的设计模式设计模式大概分为三大类:一. 创建型: 单例设计模式 抽...

  • JAVA几种常见设计模式

    一、工厂模式 1.1、场景解析 定义一个对象,根据子类唯一标识,获取对应的实现进行业务操作 1.2、使用示例 以下...

  • 前端常用设计模式

    前端常见的设计模式主要有以下几种: 单例模式 工厂模式 策略模式 代理模式 观察者模式 模块模式 构造函数模式 混...

  • APP导航设计

    良好的APP导航设计模式决策对整个app的核心体验起到关键作用。几种常见的移动APP导航设计模式对比图。 ☆ AP...

  • 设计模式

    常用的设计模式:单例模式,工厂模式,观察者模式,代理模式,其他的我使用不多。单例模式最常见也最简单分为几种实现:懒...

  • Java设计模式—单例模式

    概念 java中单例模式是一种常见的设计模式,单例模式的写法有好几种,比较常见的有:懒汉式单例、饿汉式单例。单例模...

  • Java高并发之设计模式

    本文主要讲解几种常见并行模式, 具体目录结构如下图. 单例 单例是最常见的一种设计模式, 一般用于全局对象管理, ...

网友评论

      本文标题:几种常见的设计模式

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