JavaScript中实现接口的方法有三种:

第一种,使用注释的方法实现接口

特点:
(1)最简单,但是功能最弱
(2)利用 interface和 implement"文字"
(3)把他们用注释的方式表现出来 具体实现如下: 1,用注释定义一个接口
 /*
* interface PersonDao(){
* function add(obj);
* function remove(obj);
* function find(id);
* }
* */

(2)用注释来注明实现的接口

 /*
* PersonDaoImp implement PersonDao (PersonDaoImp实现接口PersonDao)
* */
var PersonDaoImp=function () { };//定义实现类
//实现
PersonDaoImp.prototype.add=function(obj){
//具体代码
}
PersonDaoImp.prototype.remove=function(obj){
//具体代码
}
PersonDaoImp.prototype.find=function(id){
//具体代码
}

总结:

(1)使用文字的形式告知是谁实现谁
(2)优点,这样是很有意义的,大型项目需要的就是规范和标准,可以在没有写实现之前充分考虑架构和设计
(3)缺点:需要人为的遵守注释中的说明
第二种,使用属性检验法实现接口 。 实质为通过一个属性判断实现了谁
具体如下:
1,用注释来定义一个接口
  /*
* interface PersonDao(){
* function add(obj);
* function remove(obj);
* function find(id);
* }
* */
2,用注释来说明实现接口类+实现类中增加属性
/*
* PersonDaoImp implement PersonDao
* */
var PersonDaoImp=function () {
this.implementInterface=["PersonDao"];//告知该类实现的接口是啥是一个数组,
}
PersonDaoImp.prototype.add=function(obj){
alert(obj);
}
PersonDaoImp.prototype.remove=function(obj){
//具体实现
}
PersonDaoImp.prototype.find=function(id){
//具体实现
}

(3)检验属性的方法

  //接收一个不定参数 可能有多个  使用Object
function imp1(Object) {
//遍历传入对象的所用属性 i=1:第一个是不定参数,从第二个参数开始遍历接口,故i=1
for(var i=;i<arguments.length;i++){//arguments除Object外
var interfaceName=arguments[i];
var interfaceFind=false;
for(var j=;j<Object.implementInterface.length;j++){
if(Object.implementInterface[j]==interfaceName){
interfaceFind=true;
break;
}
}
if(!interfaceFind){
return false;
}
}
return true;
}

(4)接口与实现类的配合实现

  function addObj(obj) {
var PersonDao=new PersonDaoImp();
//开始检查 实现类是否实现接口
if(!imp1(PersonDao,"PersonDao")){//某对象是否实现接口(对象,接口) 第一次参数是对象,第二个参数是不定参数
throw new Error("PersonDaoImp没有实现接口PersonDao");
}else{//实现
PersonDao.add(obj);
}
}

(5)使用

addObj("实现");

总结一下,该种方式只是简单判断了在实现时有没有传递与属性中相同的接口名称,而对于方法是否实现没有做验证。

 于是有了第三种的鸭式变形法--检验接口中的方法是否实现。
第三种,鸭式变形法  一种形似的命名方式,从实现角度来理解为:如果对象中具有的方法与接口中定义的方法同名  则认为是实现了本接口。
具体如下:
1,定义一个接口类 注意这里与上面两种不一样了,不用写注释说明了
var Interface=function (name,methods) {//name:接口名字
if(arguments.length<){
alert("必须是两个参数")
}
this.name=name;
this.methods=[];//定义一个空数组装载函数名
for(var i=;i<methods.length;i++){
if(typeof methods[i]!="string"){
alert("函数名必须是字符串类型");
}else {
this.methods.push( methods[i]);
}
}
}

2,定义一个静态方法来实现接口与实现类的 直接检验
注意,静态方法不要写成Interface.prototype ,因为这是写到接口的原型链上的,我们要把静态的函数直接写到类层次上。
Interface.ensureImplement=function (object) {
if(arguments.length<){
throw new Error("参数必须不少于2个")
return false;
}
for(var i=;i<arguments.length;i++){
var inter=arguments[i];
//如果是接口就必须是Interface类型
if(inter.constructor!=Interface){
throw new Error("如果是接口类的话,就必须是Interface类型");
}
//判断接口中的方法是否全部实现
//遍历函数集合
for(var j=;j<inter.methods.length;j++){
var method=inter.methods[j];//接口中所有函数 //object[method]是传入的函数
if(!object[method]||typeof object[method]!="function" ){//实现类中必须有方法名字与接口中所用方法名相同
throw new Error("实现类中没有完全实现接口中的所有方法")
}
}
}
}

3,应用

3.1定义自己的接口

例如:此处定义两个接口

 var FirstInterface=new Interface("FirstInterface",["add","remove","search"]);//第一个接口
var SecondInterface=new Interface("SecondInterface",["save"]);//第二个接口

3.2,定义实现类

 function commManager() {//实现两个类
//先实现方法
this.add=function () {
alert("ok--实现");
}
this.remove=function () {
}
this.search=function () {
}
this.save=function () {
}
//检验
Interface.ensureImplement(this,GridManager,formManager);
}

3.3,实现类的实例化

var comm=new commManager();
comm.add();//调用

总结:三种方式都有自己的优势与缺点,每种的选择需要根据自己的需要进行选择。但是在设计的时候实现类间低耦合的相当重要的。

本人初学,若有不足之处,还希望大家能多多指出,大家相互学习,谢谢。

 

												

JavaScript设计模式接口的更多相关文章

  1. 读书笔记之 - javascript 设计模式 - 接口、封装和链式调用

    javascript 采用设计模式主要有下面的三方面原因: 可维护性:设计模式有助于降低模块之间的耦合程度.这使代码进行重构和换用不同的模块变得容易,也使程序员在大型项目中合作变得容易. 沟通:设计模 ...

  2. 《javascript设计模式》--接口

    关于javascript设计模式书中的接口,记录如下 //TODO  增加了一个判断条件,可以只在生产环境中调用 接口var Interface = function(name,methods){ i ...

  3. javascript设计模式开篇:Javascript 接口的实现

    javascript语言不像java. c#. c++等面向对象语言那样有完备的接口支持,在javascript中,接口的实现有三种方式,分别为注释描述.属性检查.鸭式变形.注释描述实现起来最为简单, ...

  4. 《JavaScript设计模式 张》整理

    最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. 常用的Javascript设计模式

    <parctical common lisp>的作者曾说,如果你需要一种模式,那一定是哪里出了问题.他所说的问题是指因为语言的天生缺陷,不得不去寻求和总结一种通用的解决方案. 不管是弱类型 ...

  7. JavaScript设计模式学习笔记

    1 JavaScript设计模式深入分析 私有属性和方法:函数有作用域,在函数内用var 关键字声明的变量在外部无法访问,私有属性和方法本质就是你希望在对象外部无法访问的变量. 特权属性和方法:创建属 ...

  8. JavaScript设计模式:读书笔记(未完)

    该篇随我读书的进度持续更新阅读书目:<JavaScript设计模式> 2016/3/30 2016/3/31 2016/4/8 2016/3/30: 模式是一种可复用的解决方案,可用于解决 ...

  9. JavaScript的学习--JavaScript设计模式的总结

    这篇博客只是自己对设计模式的理解的备忘~ 看完了<JavaScript设计模式>这本书,一直没有写博客记录一下,最近抽出时间来重读了一下,就顺便记录一下~ 如果你只是想粗略了解一下Java ...

随机推荐

  1. 消息摘要技术(MD5)

    1.使用消息摘要技术对密码加密 数据库存储的是经过消息摘要技术加密之后的信息, 避免保存密码明文,提升了系统安全性 必要性说明: 如果存储明文密码,数据库系统管理员和攻破系统的黑客是可以拿到你的所有信 ...

  2. copy和mutableCopy都是浅拷贝!!!------你被骗了很多年

    所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! (ps:什么是容器?比如NSArray,NSMutableArray,NSDictionary,NSMutableDiction ...

  3. 【C#多线程编程实战笔记】二、 线程同步

    使用Mutex类-互斥锁 owned为true,互斥锁的初始状态就是被主线程所获取,否则处于未获取状态 name为定义的互斥锁名称,在整个操作系统只有一个命名未CSharpThreadingCookb ...

  4. Django1.10主题指南—模型

    模型是你的数据的唯一的.权威的信息源.它包含你所储存数据的必要字段和操作行为.通常,每个模型都对应着数据库中的唯一一张表. 基础认识: 每个model都是一个继承 django.db.models.M ...

  5. 关于javascript原型链的个人理解

    首先js是一种面对对象的语言,虽然大多数时候是以面对过程的形式展现出来.先来看一段代码: function Base() { this.name = 'tarol'; } function Sub() ...

  6. 【★】IT界8大恐怖预言

    IT界的8大恐怖预言 本文字数:3276 建议阅读时间:你开心就好 第三次科技革命已经进入白热化阶段---信息技术革命作为其中最主要的一环已经奠定了其基本格局和趋势.OK大势已定,根据目前的形势,小编 ...

  7. 转:【Java并发编程】之十:使用wait/notify/notifyAll实现线程间通信的几点重要说明

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17225469    在Java中,可以通过配合调用Object对象的wait()方法和no ...

  8. 第二次项目冲刺(Beta阶段)5.25

    1.提供当天站立式会议照片一张 会议内容: ①检查前一天的任务情况. ②制定新一轮的任务计划. ③对这几日的冲刺进行总结. 2.每个人的工作 (1)工作安排 队员 今日进展 明日安排 王婧 #63(完 ...

  9. 团队作业8——第二次项目冲刺(Beta阶段)5.22

    1.当天站立式会议照片 会议内容: ①:检查总结上次任务完成情况 ②:安排本次任务的分工 ③:反思前三次自己的不足 ④:协商解决代码进度.成员投入时间等问题 2.每个人的工作 工作中遇到的困难: 代码 ...

  10. java201521123118《java程序设计》第5周总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过 ...