单例模式
顾名思义:一个类有且只有一个实例,称之为单例模式。
代码实现:
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;
|