蛀牙--《设计模式---通往未来的很高的台阶之(二)》

xiaoxiao2021-02-28  67

本文承接(一)

上文介绍到多态 本文从JavaScript的多态开始记录

设计模式学习前期准备:

1、js的多态

多态的思想就是吧坐什么和谁去做分离开。以Java为例,大家都知道Java是静态类型语言,要实现多态,归根结底是要消除类型之间的耦合关系。如果类型之间的耦合关系没有消除,那么makeSound方法中指定的叫的指令的对象是某个类型,他就不可能再被替换为另一个类型,在java中,可以通过向上转型来实现多态。

然而。js的变量类型在运行时是可以变化的,这就意味着js对象的多态性是与生俱来的。

2、多态思想在面向对象程序设计中的作用

多态的最根本好处在于,你不必在向对象询问你是什么类型。然后根据得到的答案调对象的的某个行为。 蛇魔意思呢?:::::

举个栗子———

拍电影,导演喊开始,灯光师做灯光,演员背台词,道具师撒雪花,群演逃跑等。在听到指令时,每个人多知道自己应该坐什么。如果不利用对象的多态,导演就得走到每个人面前告诉他该坐什么。耽误进度

这个例子就和动物的叫声类似

《JavaScript设计模式与开发实践》中一例 假设我们编写一个地图应用,利用谷歌和百度地图提供的API

var googleMap = { show:function(){ console.log("显示地图"); } }; var renderMap = function(){ googleMap.show(); } renderMap(); //开始渲染谷歌地图

后来因为某些原因要把谷歌地图换成百度地图,为了让renderMap函数保持一定的弹性,我们利用一些条件分支让renderMap函数同时支持谷歌和百度地图:

var googleMap = { show:function(){ console.log("显示谷歌地图"); } }; var baiduMap = { show:function(){ console.log("显示百度地图"); } }; var renderMap = function(type){ if(type === "google"){ googleMap .show(); }else if(type === "baidu"){ baiduMap.show(); } } renderMap('google') // 显示谷歌地图 renderMap('baidu') //显示百度地图

虽然renderMap保持了一定的弹性,但是再加一个怎么办,无疑是还是要改动renderMap函数继续添加条件分支。所以说这种弹性很脆弱。

那么怎么改进才能保持健壮的弹性呢???

咦咦咦—-换图片了 惊讶

找你妹都玩过吧,咱们反过来找相同的地方

分析: 不管是谷歌百度还是别的 地图都要渲染吧,假设地图都是以show方法来展现的,这就是相同的部分,映射到代码中

var renderMap = function(map){ if(map.show instanceof Function){ map.show(); } } renderMap(googleMap);// 显示谷歌地图 renderMap(baiduMap);//显示百度地图

根据以上代码,对象的多态性提示我们,坐什么 和 怎么做 是可以分开的 , 即使以后增加了别的地图,renderMap函数依然不需要改变。比如我们增加一个 蛀牙地图

var zhuyaMap = { show:function(){ console.log('显示蛀牙地图'); } }

如果每个地图调用显示的方法不是show 而且还都不一样 怎办。这时候就可以 应用适配器模式来解决问题 适配器模式将在后续的更新中提到

我们已经一再强调了多态在设计模式中的重要性。

感谢《JavaScript设计模式与开发实践》一书给予的知识

人之所以弱小是因为还有缺陷,之所以变得强大,是因为克服了自己的缺陷 —-《蛀牙》

之后将介绍封装——-未完待续

转载请注明原文地址: https://www.6miu.com/read-59666.html

最新回复(0)