单例模式
顾名思义:一个类有且只有一个实例,称之为单例模式。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   |  function Person() { };
  const newFn = (function () {     var instance;     return function () {         if (!instance) {             instance = new Person();         };         return instance;     }; })();
  var f1 = newFn();  var f2 = newFn();  console.log(f1 === f2); 
 
  | 
 
组合模式(观察者模式)
组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构。除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性
使用场景:
A.含有某种层级结构的对象集合(具体结构在开发过程中无法确定)
B.希望对这些对象或者其中的某些对象执行某种操作
缺点:
因为组合对象的任何操作都会对所有的子对象调用同样的操作,所以当组合的结构很大时会有性能问题。
代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
   | class GoHome {     init() {         console.log("到家了,开门")     } };
  class OpenMusic {     init() {         console.log("打开音乐")     } }
  class OpenComputer {     init() {         console.log("打开电脑")     } };
  class Comb {     constructor() {         this.skills = [];     }     add(task) {         this.skills.push(task)     }     action() {         this.skills.forEach((item) => {             item.init();         })     } };
  var comb = new Comb(); comb.add(new GoHome()); comb.add(new OpenComputer()); comb.add(new OpenMusic());
 
 
  comb.action();
  | 
 
适配器模式
适配器模式,将一个接口装换成客户希望的另一个接口,使接口兼容那些类可以一起工作。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | class Fn{     test(){         return '旧接口'     } };
  class Target{     constructor(){         this.fn = new Fn();     };     test(){         const info = this.fn.test();         return `适配${info}`;     } }; const target = new Target(); console.log(target.test()) 
  | 
 
代理模式
代理模式,访问者和目标对象之间添加一层代理,通过代理授权和控制。简单理解就是为原对象找一个替代对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   |  const idol = {     name:'lisa',     price:10000,     iphone:110000 };
  const proxy = new Proxy(idol,{     get(target,key,value){         return '经纪人电话1100000';     },          set(target,key,value){         if(key==='price'){             if(value<target.price) throw new Error('报价过低');             target.price = value;         };         return true;     } }); proxy.iphone  proxy.price = 1000; 
  |