<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript高级语法5-接口</title>
</head>
<body>
<script>
/*
* 接口:
* 1.注解的方法
* 最简单,功能最弱,利用interface和implement“文字”
* 把他们用注解的方式显式表现出来。
* 2.属性检验法
* 3.鸭式变形法 * */ //1.注解方法
function demo1(){
(function b(){
/*
* 用注释来定义一个接口
* interface PersonDao(){
* function add(obj);
* function remove(obj);
* function find(id);
* }
*/
//用注释的方式实现它
/*
* PersonDaoImpl implement interface
* */
var PersonDaoImpl = function(){};
PersonDaoImpl.prototype.add = function(obj){
//
}
PersonDaoImpl.prototype.remove = function(obj){
//
}
PersonDaoImpl.prototype.find = function(id){
//
}
/*
* 千万不要感觉它是没有任何意义的
* 1.大型项目靠的就是标准和规范
* 2.这样的写法会让你的程序员在没有写实现之前有充分时间做代码的设计和架构
* 3.缺点:要人为的遵守 * */
})();
}
//2.属性检验法
function demo2(){
(function(){
/*
* 用注释来定义一个接口
* interface PersonDao(){
* function add(obj);
* function remove(obj);
* function find(id);
* }
*/
/*
* PersonDaoImpl implement interface
* */
var PersonDaoImpl = function(){
this.implementInterface=["PersonDao"];
};
PersonDaoImpl.prototype.add = function(obj){
//
alert(obj);
}
PersonDaoImpl.prototype.remove = function(obj){
//
}
PersonDaoImpl.prototype.find = function(id){
//
} function addObj(obj){
var PersonDao = new PersonDaoImpl();
//开始检查
if(!impl(PersonDao,"PersonDao")){
throw new Error("类PersonDaoImpl没有实现接口PersonDao")
}else{
PersonDao.add(obj);
}
}
addObj("张三")
//他接收一个不定参数:属性检验函数
function impl(obj){
//遍历传入对象的属性
for(var i=1;i<arguments.length;i++){
var interfaceName = arguments[i];
var interfaceFound = false;
for(var j=0;j<obj.implementInterface.length;j++){
if(obj.implementInterface[j] == interfaceName){
interfaceFound=true;
break;
}
}
if(!interfaceFound){
return false;
}
}
return true;
}
})()
} //3. 鸭式变形法:
/*来源于一个国外老头,他有句名言:
* "像鸭子一样走路,并且会嘎嘎叫的东西"
* 换言之:
* 如果对象具有与接口定义的方法名字的所有方法(同名的所有方法),那么就认为实现了接口。
*/ function demo3(){
(function(){
//定义一个接口类
var Interface = function(name ,methods){
if(arguments.length!=2){
alert("interface must have two params")
}
this.name = name; //接口名字
this.methods = [];//定义一个空数组来装载函数名
for(var i=0;i<methods.length;i++){
if(typeof methods[i] != "string"){
alert("method name must be string")
}else{
this.methods.push(methods[i]);
}
}
}
// 定义接口的一个静态方法来实现接口与实现类的直接检验
//静态方法不要写成Interface.prototype.* 因为这是写到接口的原型链上的
//我们要把静态的函数直接写到类层次上。
Interface.ensureImplements = function(obj){
if(arguments.length<2){
alert("至少两个参数");
return false;
}
//遍历
for(var i=1;i<arguments.length;i++){
var inter = arguments[i];
//如果你是接口,就必须是interface类型的,
if(inter.constructor != Interface){
throw new Error("必须是接口类型")
}
//遍历函数集合并分析
for(var j=0;j<inter.methods.length;j++){
var method = inter.methods[j];
//实现类中必须有方法名 和 接口中所有的方法名相同
if(!obj[method] || typeof obj[method]!="function"){
throw new Error("类中实现类并没有完全实现接口中的所有方法")
}
}
}
}; //应用
//定义自己的接口
var GridManager = new Interface("GridManager",["add","remove","list"]);
var FormManager = new Interface("FormManager",["save"]); function commonManager(){
//先实现方法
this.add = function(){
alert("ok");
}
this.list = function(){}
this.remove = function(){}
this.save = function(){}
//检验
Interface.ensureImplements(this,GridManager,FormManager)
} var c = new commonManager();
c.add();
})()
}
/* 接口的重要性:
* 1.大型项目提高代码的灵活度
* 2.松耦合
* 3.在团队开发的时候,有时候在你真正编码之前就可以写API(自己的类库)。
* 这些类库就可以事后进行实现。
* 开始的时候我们就可以对整个项目是否可行,通过接口就可以模拟出来。
*/ </script>
</body>
</html>

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

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

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

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

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

  3. JavaScript设计模式读书笔记之一:接口

    接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...

  4. JavaScript设计模式 Item 2 -- 接口的实现

    1.接口概述 1.什么是接口? 接口是提供了一种用以说明一个对象应该具有哪些方法的手段.尽管它可以表明这些方法的语义,但它并不规定这些方法应该如何实现. 2. 接口之利 促进代码的重用. 接口可以告诉 ...

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

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

  6. JavaScript设计模式接口

    JavaScript中实现接口的方法有三种: 第一种,使用注释的方法实现接口 特点:(1)最简单,但是功能最弱(2)利用 interface和 implement"文字"(3)把他 ...

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

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

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

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

  9. 【总结】浅谈JavaScript中的接口

    一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...

随机推荐

  1. Spring IOC 和 AOP概述

    IoC(控制反转,(Inversion of Control):本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫控制反转,即交给了IoC容器,Spring的IoC容器主要使用DI方 ...

  2. (4)-optXXX方法的使用

    在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...

  3. Math类的三个方法比较: floor() ceil() round()

    public class Test { public static void main(String[] args) { double d1 = 3.4, d2 = 3.6; //正数 double ...

  4. linux的定制和发布(二)

    Linux的发布         有时候希望将定制好的Linux移植到其他的机器上使用,所以我们将定制好的Linux制作 成安装光盘的形式,可以方便在其他机器上安装. 为此我们要先制作一个引导系统,由 ...

  5. aspnetPage分页控件

    项目里面有一个分页,刚好知道了aspnetPage分页控件,现在就把实现步骤和代码贴出来分享一下,如有错误欢迎指正. http://www.webdiyer.com  该控件原网址.里面文档 1.首先 ...

  6. WPF TriggerAction弹出子窗体 TargetedTrigger、TargetedTriggerAction用法

    namespace TriggerAction { public class OpenWindowAction : TriggerAction<DependencyObject> { pu ...

  7. JAVA实现长连接(含心跳检测)Demo

    实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的.       如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端:       Client通过持有Sock ...

  8. NOIP2012BLOCKADE贪心思想证明

    NOIP2012BLOCKADE贪心思想证明 这道题的做法是二分时间并检验这个时间是否可行.检验的方法要用到贪心思想. 对于不能到根结点的军队应该尽量向根结点走. 如果军队A能走到根结点但到根结点后剩 ...

  9. CodeChef March Challenge 2019题解

    传送门 \(CHNUM\) 显然正数一组,负数一组 for(int T=read();T;--T){ n=read(),c=d=0; fp(i,1,n)x=read(),x>0?++c:++d; ...

  10. Get 和 Post 方法的选择和URL的设计

    原文链接:http://yifei.me/note/540 HTTP 中常用的方法有 GET/POST/PUT/DELETE 等,在设计API或者表单的时候我们需要选择合适的方法.一般有两种方案: 只 ...