JavaScript设计模式-5.接口
<!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.接口的更多相关文章
- 《javascript设计模式》--接口
关于javascript设计模式书中的接口,记录如下 //TODO 增加了一个判断条件,可以只在生产环境中调用 接口var Interface = function(name,methods){ i ...
- 读书笔记之 - javascript 设计模式 - 接口、封装和链式调用
javascript 采用设计模式主要有下面的三方面原因: 可维护性:设计模式有助于降低模块之间的耦合程度.这使代码进行重构和换用不同的模块变得容易,也使程序员在大型项目中合作变得容易. 沟通:设计模 ...
- JavaScript设计模式读书笔记之一:接口
接口 在JavaScrip中模仿接口 用注释描述接口 用属性检查模仿接口 用鸭式辨型模仿接口 依赖于接口的设计模式 工厂模式 组合模式 装饰者模式 命令模式 接口 在JavaScrip中模仿接口 用注 ...
- JavaScript设计模式 Item 2 -- 接口的实现
1.接口概述 1.什么是接口? 接口是提供了一种用以说明一个对象应该具有哪些方法的手段.尽管它可以表明这些方法的语义,但它并不规定这些方法应该如何实现. 2. 接口之利 促进代码的重用. 接口可以告诉 ...
- javascript设计模式开篇:Javascript 接口的实现
javascript语言不像java. c#. c++等面向对象语言那样有完备的接口支持,在javascript中,接口的实现有三种方式,分别为注释描述.属性检查.鸭式变形.注释描述实现起来最为简单, ...
- JavaScript设计模式接口
JavaScript中实现接口的方法有三种: 第一种,使用注释的方法实现接口 特点:(1)最简单,但是功能最弱(2)利用 interface和 implement"文字"(3)把他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 【总结】浅谈JavaScript中的接口
一.什么是接口 接口是面向对象JavaScript程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
随机推荐
- An error "Host key verification failed" when you connect to other computer by OSX SSH
Here's quick way to remove all entries in the host file: In an OSX terminal, type rm -f ~/.ssh/known ...
- ZooKeeper 一致性协议 ZAB 原理
一致性协议有很多种,比如 Paxos,Raft,2PC,3PC等等,今天我们讲一种协议,ZAB 协议,该协议应该是所有一致性协议中生产环境中应用最多的了.为什么呢?因为他是为 Zookeeper 设计 ...
- EAS.Net 在程序里配置组件
public class BeforStart { /// <summary> /// 程序配置初始化 /// </summary> public static void EA ...
- Buffer Pool--锁定内存页
锁定内存页在数据库中的优点和缺点: SQL Server 使用VirtualAlloc来分配内存,无内存压力时,SQL Server会尽可能地申请内存来缓存数据,当内存出现压力时,会出现缓存数据频繁地 ...
- C# autofac的一些使用
这次项目需要用autofac动态注册插件dll,插件修改或扩展后,在不重新编译的情况下能加载新的插件. 于是我们用autofac从配置文件注册.注册的文件固定named.这样不管插件怎么变,我们Res ...
- sqlite 插入数据 too many variables
相关文档:http://www.sqlite.org/limits.html#max_variable_number 一次插入条数限制500,参数最多999个.
- iOS 访问模拟器数据
1. 如果文件隐藏,进入命令行,输入: defaults write com.apple.finder AppleShowAllFiles -bool true 2. 进入 Finder,shift ...
- django系列1--介绍与简单原理, wsgiref模块
一.web应用框架 Web应用框架(Web application framework)是一种计算机软件框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通性活动的工 ...
- “全栈2019”Java第九十二章:外部类与内部类成员覆盖详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- VIO的Bundle Adjustment推导
IMU模型和运动积分 $R_{\tiny{WB}} \left( t +\Delta{t} \right) = R_{\tiny{WB}} \left( t \right) Exp\left( \in ...