javascript设计模式和开发实践(阶段一)

1,设计模式的作用:让人们写出可复用和可维护性高的程序,代价可能是,额外增加代码量;

比较形象的例子:空房间里面放东西,如果日复一日的往里面扔东西,时间久了,很难找到自己想要的东西,调整也不容易,但是做一些柜子放东西,虽然前期增加了成本,但是在维护阶段带来了极大的好处。【柜子存放东西】,或许就是一种模式。

2,所有设计模式的实现遵循一条原则:找出程序中变化的地方,并将变化封装起来。程序中不变和稳定的部分是很容易复用,所以需要封装变化的部分。

初学者针对设计模式很容易出现“锤子理论”:当我们有一把锤子,看什么都是钉子。意思是:设计模式的深刻意图,只有结合实际项目场景灵活使用。

3,编程语言分类:静态类型,动态类型。

静态类型语言:在编译时候便已经确定变量的类型。动态类型语言:变量被赋值后,才具有某种类型。

静态语言和动态语言的优缺点:静态语言明确规定了数据类型,迫使程序员按照契约来写程序,辅助程序员编写可靠性高的代码,动态语言优点是编写代码量减少,更加简洁,但是无法保证变量类型,可能在运行过程中发生跟类型相关的错误。Javascript是一门典型的动态类型语言,动态类型语言对变量类型带来了很大的宽容性。

“鸭子类型”:如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。通俗易懂的来讲:我们关注的是对象的行为,不关注对象本身。

(我觉着这本书写的好棒,下面还有个鸭子的故事程序)

var duck = {
    duckSinging(){
        console.log('嘎嘎嘎')
    }
}
var chicken = {
    duckSinging(){
        console.log('嘎嘎嘎')
    }
}
var choir = [];  //合唱团
var joinChoir = function(animal){
    if(animal && typeof animal.duckSinging === 'function'){
        choir.push(animal);
        console.log('恭喜加入合唱团');
        console.log('合唱团已有成员数量:'+choir.length)
    }
}
joinChoir(duck);
//恭喜加入合唱团
//合唱团已有成员数量:1
joinChoir(chicken);
//恭喜加入合唱团
//合唱团已有成员数量:2  

对于加入合唱团的动物,无论小狗,小鸡,小猫,只要拥有duckSinging的方法,就能够加入进来。在动态类型语言的面向对象方法中,“鸭子类型”概念至关重要。

利用“鸭子类型”思想,“面向接口编程,而不是面向实现编程”。面向接口编程,意思就是不是很关注实现,只关注接口API的输出,对象内部的变化对其他对象而言是透明的,也就是不可见的,透明的意思是:你不知道它是如何做到的,反正它就是能做到。

var makeSound = function(animal){
    if(animal instanceof Duck){
        console.log('嘎嘎嘎')
    }else if(animal instanceof Chiken){
        console.log('咯咯咯')
    }
}
var Duck = function(){};
var Chiken = function(){};
makeSound(new Duck()); //嘎嘎嘎
makeSound(new Chiken())  //咯咯咯

上面的代码体现了“多态”,将“做什么”和“怎么做”分开,就是当我们对调用一些函数时,函数会返回不同的执行结果,这就是多态性的一种体现。

 

posted @ 2018-10-26 19:46  tangjiao_Miya  阅读(478)  评论(0编辑  收藏  举报