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程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
 
随机推荐
- java并发编程实战:第十章----避免活跃性危险
			
在安全性和活跃性之间通常存在着某种制衡 一.死锁 定义:在线程A持有锁L并想获得锁M的同时,线程B持有锁M并尝试获得锁L,线程AB均不会释放自己的锁,那么这两个线程将永远地等待下去 在数据库系统的设中 ...
 - 在github创建用户
			
在Github注册账户 第一个是创建用户名,第二个是填写邮箱,第三个是设置密码 进入给github会让你选择账户类型 第二步完成后会让你完成邮箱的验证 验证完邮箱以后此时就验证成功了点击绿色的 let ...
 - typescript 自动编译 生成js文件
			
项目文件 <?xml version="1.0" encoding="utf-8"?><Project ToolsVersion=" ...
 - solr介绍一:Analyzer(分析器)、Tokenizer(分词器)
			
首先,不知道大家在前面的例子中没有试着搜索文本串,就是在第二节,我们添加了很多文档.如果字段值是一个文本.你如果只搜索这个字段的某个单词,是不是发现搜不到? 这就是因为我们没有配置Analyzer,因 ...
 - 修改mysql的时间/时区
			
# 背景 往db中insert数据发现时间不对,因为是新DB,所以猜测是mysql设置不对 # 解决方法 方法一:通过mysql命令行模式下动态修改 show variables like " ...
 - mysql免安装版初始化
			
解压之后复制my-default.ini到本地目录下的my.ini 修改key: basedir = D:\\software\mysql-5.7.12-winx64 datadir = D:\\s ...
 - ashx、aspx、ASP.NET MVC
			
ashx:ProcessRequest(IHandler的方法)aspx:Page_Load(Page继承IHttpHandler)(RouteHandler)(HttpHandler)(MvcHan ...
 - 记录---IIS显示asp.net程序的具体错误
			
原来IIS设置成显示单一的错误页面 但是最近的服务器页面报错,但是本地确实完好的:所以想着让服务器显示具体的报错 网上找到两种方法: 先说第一种有效的: 通过 web.config 配置 其实,上面在 ...
 - 获取outlook联系人寻呼字段
			
这称不上一篇技术文. 这边记录解决一个问题的过程和感受.这种感觉每个搞IT的人或多或少都感受过,是程序人独有的快乐之一.只是大部分人没有将这种感觉记录下来.但是当你记录时,这种感觉也早已消失. 需求: ...
 - 使用echarts绘制漂亮的渐变键盘仪表盘
			
echarts官方示例和默认样式都比较难看,经过一顿捣鼓实现比较漂亮的渐变仪表盘. 第一步:设置轴线 将图表轴线.label.分割线.隐藏,只保留刻度,然后修改刻度样式达到最终效果.不过要注意的是ax ...