概述
什么是鸭子类型
如果走起来是鸭子,叫起来是鸭子,那么它就是鸭子。亦或者说,一个食物无论是面制品,还是豆制品,只要吃起来是牛肉味,它就是牛肉干。
鸭子类型-多态的示例
如果是初学者,看到一些编程思想的东西,平时又没有写过类似的代码,一定会一脸蒙,实在是抽象。就像看到这个标题,一定有很多的疑问?鸭子类型和我平时的代码有什么关系?什么又是多态?鸭子类型跟多态又有什么关系了?多态又是为了实现什么目的了?
对于为什么会出现对上面鸭子类型的定义,我想本质上是还是希望一个东西能够描述尽可能多的东西,这样创建的“类”才有意义。因此只要这些东西满足一个特点,我们就可以把它们归位一类。
其实本质就是一句话,多态是鸭子类型背后的思想,或者说用鸭子类型做个 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复