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程序员的工具箱中最有用的工具之一.在设计模式中提出的可重用的面向对象设计的原则之一就是“针对接口编程而不是实现编程”,即我们所说的面向接口编程,这个概 ...
随机推荐
- ViewPage实现无限轮播画廊效果
1. 效果图 2. 布局文件 主要使用的 android:clipChildren的意思:是否限制子View在其范围内.再父布局和viewpager中设置该属性 ,要显示三个界面 ,还要设置marg ...
- Android-Camera+SurfaceView
Camera相机是属于硬件,每台设备的Camera硬件配置的参数都是不一样的,Camera通常是用来拍照,扫描二维码等等 AndroidManifest.xml配置Camera需要的权限: <! ...
- MSP430 G2553 LaunchPad GPIO中断
P1.P2端口上的每个管脚都支持外部中断.P1端口的所有管脚都对应同一个中断向量(Interrupt Vector),类似的,P2端口的所有管脚都对应另一个中断向量:通过PxIFG寄存器来判断中断来源 ...
- 如何在CentOS 7中禁用IPv6
最近,我的一位朋友问我该如何禁用IPv6.在搜索了一番之后,我找到了下面的方案.下面就是在我的CentOS 7 迷你服务器关闭IPv6的方法. 你可以用两个方法做到这个. 方法 1 编辑文件/etc/ ...
- sharepoint 通过数据库擅长列表项
select *from [dbo].[AllLists] where tp_Title='Pages' and tp_WebId='68BDFC9A-4E0C-425E-9985-573CD6716 ...
- poj做的题
1699 1080 1170 1239(不错) 1659(读读怎么写)
- D - How Many Tables (并查集)(水题)
点击打开链接 Today is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius want ...
- ZJOI2019 游记
Day -2 入住酒店,跟 Sooke 一个房间 酒店还是很好的呢 然后就是颓废 Sooke 和 zxy,ljx,lyt,xx 一起打 lol,我孤独的打着坦克和 MC 然后复习了一下板子 Day - ...
- LOJ#6360. 复燃「恋之埋火」(最小圆覆盖+高斯消元)
题面 传送门 题解 不难发现最小圆覆盖的随机增量法复杂度还是正确的 所以现在唯一的问题就是给定若干个点如何求一个\(m\)维的圆 其实就是这一题 //minamoto #include<bits ...
- LOJ#2082. 「JSOI2016」炸弹攻击 2(计算几何+双指针)
题面 传送门 题解 我们枚举一下发射源,并把敌人和激光塔按极角排序,那么一组合法解就是两个极角之差不超过\(\pi\)且中间有敌人的三元组数,预处理一下前缀和然后用双指针就行了 //minamoto ...