第二章、接口
本章简要介绍了接口在面向对象编程的作用,好处。以及在javascirp中的接口的利弊。同时介绍了javacript中实现接口的方法。
面向对象设计的第一条原则
接口是面向对象javascript程序员的工具箱中最有用的工具之一。Gof在书中提到,面向对象设计的第一条原则就是:“针对接口编程而不是实现编程”。
javascript 没有接口
然而javascript本身没有内置的创建或实现接口的方法。也就说javascript本身是没有接口的。不过、由于javascript有强大的灵活性,最终我们可以在javascript中模拟实现接口。
接口定义,什么是接口
接口提供了一种用来说明一个对象应该具有的哪些方法的手段,它可以表明这些方法的语义,但是不规定这些方法的具体实现。呵呵感觉不怎么专业,很拗口呀。
接口利弊
先讲好处:
1、接口能促进代码重用
2、可以稳定不用类之间的通信方式
3、方便测试和调试
坏处:
1、接口强化了类型的作用,降低了javascript语言的灵活性。
2、javascript 没有原生的接口支持
3、javascript模仿接口带来性能的影响
4、javascript不能强制其他程序员遵守你的接口定义(这个要靠行政手段,呵呵)
其他语言的接口实现
其他语言基本使用了interface和implements关键字,内置支持。
javascript中模仿接口的方法
1、用注释描述接口
用注释模仿接口是最简单的方法,就是在注释里面写上接口的定义信息。这个超级简单,但效果就不怎么地了。
例子如下:
/**
//这里是接口的描述
interface XXXInterFace{
function add(child);
function remove(child);
}
*/
var XXXClass=function(){//implements XXXInterFace 说明实现了接口
}
XXXClass.prototype.add=function(){
......
}
XXXClass.prototype.remove=function(){
......
}
2、用属性检查模仿接口
这个方法比第一个要严谨一些。所有的类必须明确的声明自己实现的接口。虽然接口依旧是注释,但是你可以检查某个属性得知实现了什么样的接口。
/**
//这里是依旧是接口的描述
interface XXXInterFace{
function add(child);
function remove(child);
}
*/
var XXXClass-function(){
this.implementsInterfaces=["XXXInterFace"];//申明实现的接口
}
XXXClass.prototype.add=function(){
......
}
XXXClass.prototype.remove=function(){
......
}
//调用类的方法
function dosome(xxxClassInstance){
if(!implements(xxxClassInstance,"XXXInterFace")){//检查实现的接口
alert("没有实现 XXXInterFace")
}
}
function implements(obj){//检查实现的接口的方法
......
}
3、鸭式辨型模仿接口
鸭式辨型(鸭子测试DUCK TEST)——像鸭子一样走路并且嘎嘎叫的就是鸭子。呵呵这个很有意思,书上说的,这个是james Whitcomb Riley的名言。大家都知道这个大神不?我google了一下,并在前面的连接上加上了基维百科的连接。
写道
美国印第安纳诗人詹姆斯·惠特科姆·莱利(1849-1916)可能发明了这个说法。他写道:“当我看到一只鸟,它走路像鸭子,游泳像鸭子,叫声像鸭子,我就称其为鸭子。”
言归正传,这个方法比较前面来说,不用借助于注释,而且可以强制实施,但是多了辅助的工具类InterFace和一个辅助函数ensureImplements。
//定义申明接口
var XXXInterFace=new InterFace("XXXInterFace",["add","remove"]);
//调用方法
function doSome(instance){
ensureImplements(instance,XXXInterFace);//接口检查
}
4、本书的接口实现,Interface类
书中使用了第一中和第三种的结合,也就是我既写好了注释告诉你我实现的接口,也用到了鸭子辨型的接口检查。呵呵也就是要我们要是用接口的话,也可以模仿这样来实现。还有就是提醒大家注意好好写写注释。
书中具体的InterFace类如下:
// Constructor.呵呵抄不下去了网上下了源代码
var Interface = function(name, methods) {
if(arguments.length != 2) {
throw new Error("Interface constructor called with " + arguments.length
+ "arguments, but expected exactly 2.");
}
this.name = name;
this.methods = [];
for(var i = 0, len = methods.length; i < len; i++) {
if(typeof methods[i] !== 'string') {
throw new Error("Interface constructor expects method names to be "
+ "passed in as a string.");
}
this.methods.push(methods[i]);
}
};
// Static class method.
Interface.ensureImplements = function(object) {
if(arguments.length < 2) {
throw new Error("Function Interface.ensureImplements called with " +
arguments.length + "arguments, but expected at least 2.");
}
for(var i = 1, len = arguments.length; i < len; i++) {
var interface = arguments[i];
if(interface.constructor !== Interface) {
throw new Error("Function Interface.ensureImplements expects arguments "
+ "two and above to be instances of Interface.");
}
for(var j = 0, methodsLen = interface.methods.length; j < methodsLen; j++) {
var method = interface.methods[j];
if(!object[method] || typeof object[method] !== 'function') {
throw new Error("Function Interface.ensureImplements: object "
+ "does not implement the " + interface.name
+ " interface. Method " + method + " was not found.");
}
}
}
};
依赖接口的设计模式
工厂模式
组合模式
装饰者模式
命令模式
分享到:
相关推荐
"广东工业大学 数据结构 anyview 作业系统 第二章答案" 本资源摘要信息是关于广东工业大学数据结构anyview作业系统第二章的答案,涵盖了顺序表和链表两种数据结构的操作和比较算法。 一、顺序表的插入和比较算法 ...
20210307-德邦证券-德邦家电行业:重读与解构《第四消费时代》第三消费时代.pdf
重读闭音节是英语发音规则中的一个重要概念,主要涉及元音字母在特定音节中的发音方式。在学习英语发音时,理解并掌握这一规则对于准确读出单词至关重要。 首先,我们回顾一下重读开音节。重读开音节指的是在一个...
英语语音重读是英语口语表达中的一个重要组成部分,它关乎到信息的传递清晰度以及语调的自然流畅。在英语句子中,重读的规律主要遵循以下几个原则: 首先,实词通常需要重读。实词包括名词、动词、形容词、副词、...
英语发音规则(重读音节和非重读音节).pdf
在压缩包文件"src"中,通常包含了与《重构》第一章相关的示例代码或练习素材。读者可以通过分析和实践这些代码,更好地理解和应用书中的重构技巧。 总之,Martin Fowler的《重构--提高既有代码的设计》第一章为我们...
重读的规则包括:单音节词全部重读,双音节词通常倒数第二个音节重读,带有前缀的双音节词前缀单独算一个音节并重读,如"unhappy"。 元音字母在重读和非重读音节中的发音有所不同。在重读音节中,元音通常发音更...
c) 一些词根据前缀和词性决定重读位置,比如名词通常第一个音节重读,动词等其他词性第二个音节重读,如 "re'cord", "con'duct"。 d) 复合词和带有前缀的词,如 "out'side", "re'tell",通常有两个重读音节。 2. ...
例如,元音字母在重读音节中的长音和短音规则,以及辅音字母组合的发音模式等。掌握这些规则,可以减少记忆负担,提高拼写准确率。 此外,词义的上下文关系也是理解和记忆词汇的有效途径。通过阅读和听力练习,我们...
接着,设计语调和重读训练的教学活动。例如,可以组织角色扮演,让学生模仿对话中的语调和重读,提高他们的实际运用能力。还可以进行听力游戏,播放对话录音,让学生找出被重读的单词,进一步巩固他们对重读规则的...
c) 具有"de-", "in-", "re-"等前缀的词,其重读位置可能因词性和意义变化,比如名词"record"重读第一个音节,动词"re'cord"则重读第二个。 d) 复合词和带有前缀"re-", "ex-", "un-", "pre-"等的词,可能有两个重读...
重读南京百科知识竞赛题及答案.doc
《英语教学法》读书笔记主要探讨了小学英语教学中语音教学的重要性以及如何有效进行语音教学。以下是相关的知识点: 1. **语音教学的重要性**:对于小学英语初学者来说,没有音标辅助,良好的语音掌握需要教师的...
CSAPP 《深刻理解计算机系统》笔记 ...项目已通过Gitbook输出,地址为: ,你可以通过不同的方式来阅读此笔记 项目历史 2012年1月1日购得此书 2016年1月想重读此书并有此笔记项目 2017年11月重启此项目
德邦家电行业:重读与解构《第四消费时代》第三消费时代
通过重读,我们可以更全面地理解作者的意图,发现隐藏在字里行间的微妙之处。 总的来说,重读旧书是一种个人的享受,它让我们有机会在忙碌的生活中找到乐趣,同时深化我们对书籍和自我认知的理解。不论是因为怀旧、...
由于提供的文件内容为乱码,并且文件标题为"消费行业四大行业消费趋势电·重读消费者.pdf",但无法从乱码内容中提取实际信息,我将基于文件的标题和描述来猜测内容,并生成相关知识点。 【标题】"消费行业四大行业...
【音节划分与音节重读】是英语学习中的重要...理解音节划分和重读音节对于提高英语口语和阅读能力至关重要,因为它影响到单词的正确发音和语调的把握。通过熟练掌握这些规则,可以更准确地读出单词,提升语言的流畅性。
音节划分元音字母在重读非重读中发音.ppt
在重新阅读冰心的著作中,我再次深刻体会到了母爱的力量与温暖。冰心,这位中国现代文学的杰出女性作家,以她那清新脱俗的文笔和深刻的情感,讴歌了母爱的伟大和崇高,将母爱描绘为人间最纯洁、最坚强的爱。每当我...