写在前面的话
最近在找工作的时候,觉得应该把编程原理性,基础性的知识学的扎实一点,所以系统的学了一下设计模式,主要参考书籍是:《javascript设计模式与开发实践》,写下博客是对书中我认为比较重要的内容的一个提炼,然后自己做个总结;以下:
什么是多态
多态:同一个操作应用到不同的对象上,可以产生不同的解释和执行结果,多态背后的思想是将“做什么”和“谁去做,怎么做”分开,其中“做什么”是不变的部分,“谁去做和怎么做”是可变的部分,是细节;
比如: 主人给动物们发布一个命令“叫”,然后猫发出“喵喵喵”的叫声,狗发出“汪汪汪”的叫声;这其中主人的命令“叫”就是一个不变的部分,是“做什么”,猫、狗的叫是可变的部分,是“谁去做,怎么做”;
// 对象中多态的实现:
var makeSound = function (animate){
animate.sound();
}
var Dog = function(){};
Dog.prototype.sound = function(){
console.log("汪汪汪");
}
var Cat = function(){};
Cat.prototype.sound = function(){
console.log("喵喵喵");
}
makeSound(new Dog()); // 汪汪汪
makeSound(new Cat()); // 喵喵喵
多态在程序设计中的作用
其实多态最根本的好处是,不必询问“你是什么类型”而根据得到的答案调用对象的某个行为;你只需要调用就可以,其他的事情,多态机制为你解决;
举个栗子:封装一个“做什么”的方法,这个方法是说出某个指定人的名字
// 原始写法
var person1 = {
sayName: function(){
console.log("I am person1");
}
}
var person2 = {
sayName: function(){
console.log("I am person2");
}
}
function sayName(type){
if (type == 'person1'){
person1.sayName();
} else if (type == 'person2'){
person2.sayName();
}
}
sayName('person1');
以上是没利用多态的原始写法,为了让特定的人说出名字,需要在sayName方法内部判断人的类型,如果新添加了人,又需要继续在sayName里面添加判断方法;这样导致,sayName是可变的,可能会越来越臃肿,然而利用多态的思想可以让它是固定的,解耦合;
// 多态的写法
var person1 = {
sayName: function(){
console.log("I am person1");// 'I am person1'
}
}
var person2 = {
sayName: function(){
console.log("I am person2");
}
}
function sayName(person){
if (typeof person.sayName == 'function'){
person.sayName();
}
}
sayName(person1);// 'I am person1'
由上面可以看出,减少过程化编程中的条件分支,转化为多态性