多态

来源:互联网 发布:android应用程序优化 编辑:程序博客网 时间:2024/06/05 08:21

写在前面的话

最近在找工作的时候,觉得应该把编程原理性,基础性的知识学的扎实一点,所以系统的学了一下设计模式,主要参考书籍是:《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'

由上面可以看出,减少过程化编程中的条件分支,转化为多态性

原创粉丝点击