本文承接(一)
上文介绍到多态 本文从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设计模式与开发实践》一书给予的知识
人之所以弱小是因为还有缺陷,之所以变得强大,是因为克服了自己的缺陷 —-《蛀牙》
之后将介绍封装——-未完待续