什么是鸭子类型

如果走起来是鸭子,叫起来是鸭子,那么它就是鸭子。亦或者说,一个食物无论是面制品,还是豆制品,只要吃起来是牛肉味,它就是牛肉干。

鸭子类型-多态的示例

如果是初学者,看到一些编程思想的东西,平时又没有写过类似的代码,一定会一脸蒙,实在是抽象。就像看到这个标题,一定有很多的疑问?鸭子类型和我平时的代码有什么关系?什么又是多态?鸭子类型跟多态又有什么关系了?多态又是为了实现什么目的了?

对于为什么会出现对上面鸭子类型的定义,我想本质上是还是希望一个东西能够描述尽可能多的东西,这样创建的“类”才有意义。因此只要这些东西满足一个特点,我们就可以把它们归位一类。

其实本质就是一句话,多态是鸭子类型背后的思想,或者说用鸭子类型做个 demo 去展示多态,多态的目的是为了说明把经常变的代码和不变的分离出来的好处,而分离这两部分的最终原因是为了我们后续改写代码方便。总之,一切的一切就是为了少改代码,早下班(手动狗头)
其实这里,就是为了说明设计的模式一大核心原则就是把不变的和变的分割出来,本质上就是消除耦合;抽象再抽象,提升再提升

接下来,就把几个概念一一来分析一波。

首先,这里有一个概念称为多态。JS 就是天然地就实现多态的动态语言(动态语言:使用变量的时候不用指定其类型),因此我们即使实现了这个概念也很难察觉,而且很少有 JS 语言的文档专门提到这个概念(除了设计模式的书)。那对于这个概念该如何理解了,多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句

嗯… 好像还是不好理解,换句话说,多态就是对象在不同条件下,有不同执行结果。“不同条件”很自然就会想到使用 if 语句,但在对象中用 if 写会很繁杂,且没有把经常变的和不变的部分等分离开来而是混在一起,等缺点,所以有了多态这个概念。

再来看看鸭子类型,在《JS 设计模式与开发实践》这本书中,提到说鸭子类型的好处就是:“我们不必借助超类型的帮助,就能轻松地在动态类型语言中实现一个原则:面向接口编程,而不是面向实现编程。” 当看了这句话,我也是一脸蒙,啥是超类型啊,啥又是接口,啥又是实现编程啊。别着急,慢慢来。如果听说过 ts,一定有听过接口 interface,这里记一笔,之后就会用 ts 来实现一个 demo 再来解释这句话。

举个例子来说明这个概念,在这里,我们希望有一类动物,它会叫,若它是鸡,它就会发出“咯”的声音,如果是鸭子,就发出“嘎”的声音。写的这个类要可以拓展,因为之后可能还会让它发出其他的叫声。甚至会飞,会游泳。

首先来看一个 demo 使用 JS 来写的,

//demo1
var createSound = function (animal) {animal.sound();
};
var Duck = function () {};
Duck.prototype.sound = function () {console.log("嘎");
};
var Chick = function () {};
Chick.prototype.sound = function () {console.log("咯");
};createSound(new Chick());
createSound(new Duck());

在这个 demo 中,相当于我们把“叫”的具体实现和“叫”的方法给分成了两个部分,这样即使后面如果还有狗叫亦或者猫叫,我们都可以保持主体的不变的前提下(createSound()不变),添加新的部分。在 JS 中函数也是对象,这段代码就展示了对象的多态性——不同条件下,不同的执行结果;“叫的方法”和“叫啥”给分割开来。

假设,我们不用这个方法,而是用 if 的方法,最简单地就是直接在 createSound 中使用类似 if(type===‘duck’){console.log(‘嘎’)}的形式,当我们需要增加其他动物叫时候,就需要不断去这里添加代码。这样看起来,好像还行。but,如果说我们不只希望叫,还希望飞,还希望吃东西,那该怎么办。难道改一个动物,就得把整个代码改一遍吗。就如如下的代码,用多态的方式实现就很简单。

//demo2
var createAny = function (animal) {animal.sound();animal.fly()
};
var Duck = function () {};
Duck.prototype.sound = function () {console.log("嘎");
};
Duck.prototype.fly = function () {console.log("i can fly");
};

关于使用ts写的demo,内容依然不会太少,因此会在下篇博文中介绍。

设计模式-鸭子类型1相关推荐

  1. python有多态特性吗_Python:多态、协议和鸭子类型

    多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...

  2. python鸭制作类代码_详细解释ducktyping鸭子类型程序设计与Python的实现

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

  3. python鸭制作类代码_Python实现多态、协议和鸭子类型的代码详解

    多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态. 所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同 ...

  4. java 鸭子类_Python:多态、协议和鸭子类型

    多态 问起面向对象的三大特性,几乎每个人都能对答如流:封装.继承.多态.今天我们就要来说一说 Python 中的多态.所谓多态:就是指一个类实例的相同方法在不同情形有不同表现形式.多态机制使具有不同内 ...

  5. 面向对象—多态、鸭子类型(Day21)

    编程原则java具有自己的编程原则和设计模式,不能多继承.python的编程原则:1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的).2.依赖倒置原则:高层 ...

  6. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  7. java实现鸭子类型_面向对象—多态、鸭子类型(Day21)

    编程原则java具有自己的编程原则和设计模式,不能多继承. python的编程原则: 1.开放封闭原则:开放是对扩展是开放的,封闭是对修改是封闭的(已经写完的代码程序是不能修改的). 2.依赖倒置原则 ...

  8. python 接口(抽象) 多态,鸭子类型, 多继承原理(mro)

    抽象类与接口类 接口类 继承有两种用途: 一:继承基类的方法,并且做出自己的改变或者扩展(代码重用) 二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数 ...

  9. python鸭制作类代码_详解duck typing鸭子类型程序设计与Python的实现示例

    在程序设计中,鸭子类型(英语:duck typing)是动态类型的一种风格.在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定. 这个概念的名字来源 ...

最新文章

  1. C将十六进制数字字符串转成数字
  2. window下建立vue.js项目
  3. linux mysql插入中文乱码_解决Linux下Tomcat向MySQL插入数据中文乱码问题
  4. C语言十六进制转八进制(附完整源码)
  5. Matlab与C/C++混合编程 (基于Opencv库)
  6. 关 于 解 析 php 的 问 题
  7. 3个最常见案例详解DBA日常维护
  8. 《Oracle高性能自动化运维》一一第1章 Linux下的Oracle
  9. excel文件无法打印提示内存不足_U盘拷贝文件提示目标文件过大无法复制怎么解决...
  10. python每日经典算法题5(基础题)+1(中难题)
  11. 逻辑斯蒂回归:家庭买私家车的概率
  12. springboot2.x 集成百度 uidgenerator
  13. 管理感悟:不要过度自我合理化
  14. GP数据库-Creenplum
  15. 正则表达式过滤联系方式,微信手机号QQ等
  16. GPT2Config
  17. OC中调用Swift代码方法
  18. CQJTU web学习之HTMLCSS学习总结
  19. 西门子PLC 1214和多台G120西门子变频器Modbud RTU通讯
  20. java8 joda_Joda Time项目和java8时间api

热门文章

  1. ocr文字识别软件安卓
  2. 微信语音转换成mp3文件保存的简单详细步骤
  3. 算法笔记04--分治法之寻找最大最小元素
  4. 洛阳等地启动电子劳动合同试点,多家名企选择法大大
  5. 非酒精性脂肪性肝炎潜在治疗靶点及药物研究进展
  6. 扁平风轮播图大屏展示html页面源码
  7. 学无人机需要精通计算机吗,无人机航测没有那么难,掌握软件应用及流程就可以上路了...
  8. 【中文】【吴恩达课后编程作业】Course 5 - 序列模型 - 第一周作业
  9. 5注册激活_国家医保服务平台APP激活绑定流程
  10. php-fpm彻底解决502(php-fpm多开、nginx限制并发、定时重启)解决网站卡顿的终极奥义