以前就曾经有人问过我,“老尚,你说是不是有的面试官以虐新人为乐?”,,,我说,“传说中,据说有”,,,他说,“我觉得这应该不是传说。”
////////
这是另一个同学给我的留言,也许他就是我在前文中说过的那种“运气不太好”的同学,越努力越坎坷,遇到的都是那种“施虐”型的面试官。他在多轮面试之后的弥留之际,给我留下了这最后一句话。
呵呵,其实也没什么啦,他就是受了点打击,准备了大半夜的js,作品,结果面试官总问设计模式。
今天就来聊一下设计模式,我也来复习复习,毕竟下一期的课程里,加入了设计模式这方面的内容。
////////
设计模式是干嘛的?不就写js嘛,要它有蛋用啊,当然不是这样的。
一般认为,设计模式是一种思想,想法。不同的需求,不同的项目,用不同的结构去组织代码。
我认为,“如何去构思这个代码的结构,就是设计模式”。也许会有人不认同我这个定义,尽可以来喷我,欢迎来战。因为说到根儿上,设计模式就是“如何组织代码的不同思路的总结”。这玩艺儿最大的用处就是,“解耦”。免得代码在不断的“加需求和改需求”之间变成一坨 [bi~]
面试中问你这个,基本就是想看你对于对于代码结构化的理解。就是说,给你一个小需求,你慢慢写总能搞出来。但给你一个大项目,或是把你编入一个大项目组之中的话,过于随性的代码会让人很恼火。
那接下来,代码的结构化,是指你这个代码里面:
1,有多少东西可以封装之后,马上拿出来复用?
2,每个方法或模块吧,对其它方法或模块的依赖程度?
3,某个模块报错了,是否会卡死整个程序?
4,具体的模块方便测试么?
如果你每个方法至少需要多个参数,那就不是一个方便测试的代码。为啥很多人呼唤函数式编程呀,不就是因为它只接受一个参数,返回一个结果嘛。方便搞单元测试
所以同学们在看设计模式的时候,不要去单纯的背设计模式。而是要把它放在你的小demo,小项目之中去。当然,如果你能背下来几个设计模式,也是不错的,但结合业务一起说,不是更好嘛,还显得你有项目经验。最有用的一点是,你设计模式聊的666,能让一个小demo显得很“大”。
你是背下来也好,是放小demo里说也好。我个人吧,主观不建议去背什么32种、21种设计模式,没用,根本记不住,到时搞混了反倒打自己脸。
你就搞清楚什么“单例啊,工厂啊,观察者,代理”,我觉得面试中就可以聊一聊了。反正我就只知道这几种,剩下的20多种都没啥印象。估计也不能有哪个面试官让你像报菜名一样的把二三十种设计模式的名称都背一遍吧。
////////
单例模式,啊,最easy的。大半夜的,今天就说说这个,其余的以后再说
字面意思,单。就是某个对象,只能有一个实例。实现的思路,先判断实例是否存在,然后再返回对象,保证一个js类,只用一个实例对象。
但是js里没有类,所以这个类在js里是以构造器,也就是函数的形式出现的。其实就是一个大全局函数,挂在window下面。所以也可以认为一个单例,就是一个命名空间,里面包了一堆属性和方法。
单例一,
单例二,
单例三,
从第三例就可以看出来,其实原理很简单,就是做一个if判断,如果装载实例的变量为空,就新建一个,否则就直接返回实例。而此时,那个init方法就成了构造器。看这几个例子的时候要注意,“在js中,对象是按引用传递的。”
jQuery用的就是单例模式,看过源码的应该都知道。
////////
单例模式的用途,你可以理解为,整个项目或网站中“唯一性”的,所有人都会用到的东西。例如,咱们那个“电商网站的购物车中商品的数量”,它就是单例模式。因为它要求在全站中数据一致。
单例模式基本就是这么个东西,就写到这吧。