//javascript中定义接口的方式有三种:
//1、注解描述的方式
/**
* interface Composite{
* function add(obj);
* function remove(obj);
* function update(obj);
}
优点:程序员可以有参考
缺点:缺点一大堆,他只是一个借口的文档范畴,假如不实现
所有的方法,程序照样可以运行,太松散了。对测试和调试难度大
*/
// Implement of interface Composite
var CompositeImpl =function(){
/*this.add = function(obj){
};
this.remove = function(obj){
};
这种函数定义的方法,在实例化一个对象的时候,new
一个示例,将产生一个方法,且各个实力的方法还不一样。
所以采用下面的方法:
*/
CompositeImpl.prototype.add = function(obj){
}
CompositeImpl.prototype.remove = function(obj){
}
CompositeImpl.prototype.update = function(obj){
}
}
var c1 = new CompositeImpl();
var c2 = new CompositeImpl()
alert(c1.add == c2.add)
/**
* interface Composite{
* function add(obj);
* function remove(obj);
* function update(obj);
* }
* interface FormItem{
* function select(obj);
* }
*/
// CompositeImpl implements interface Composite,FormItem
var CompositeImpl =function(){
//显示在类的内部,接收所实现的接口,一般来说,这是一个规范,
// 我们项目经理:在内部类定义一个数组,名字要固定
this.interfaceImplments = ['Composite','FormItem'];
CompositeImpl.prototype.add = function(obj){
alert("小平果");
}
CompositeImpl.prototype.remove = function(obj){
}
CompositeImpl.prototype.update = function(obj){
}
/*CompositeImpl.prototype.select = function(obj){
}*/
}
//定义函数检测,判断当前对象是否实现了所有的接口
function checkCompositeImpl (instance){
if (!isImplments(instance,'Composite','FormItem')) {
throw new Error('Object cannot implements all the interface');
};
}
//公用的具体检测方法(核心方法),主要目的就是判断示例对象有没有实现相关的接口;
function isImplments(object){
//arguments 对象会的函数的实际对象
for (var i = 1, len = arguments.length; i < len; i++) { //注意这里从1开始,逐个方法判断。
var interfaceName = arguments[i]; //接收实现每一个接口的名字
var interfaceFound = false;//判断此方法到底是实现了还是失败了?规范里定义了interfaceImplments.
for (var j = 0;j < object.interfaceImplments.length; j++) {
if(object.interfaceImplments[j] == interfaceName){
interfaceFound = true;
break;
}
};
//如果没有实现,则返回false
if (!interfaceFound) {
return false;
};
}
return true;
}
var c1 = new CompositeImpl();
checkCompositeImpl(c1);
c1.add();
/* 实现接口的第三种方式:鸭式辨型发实现接口,(较为完美的实现方法)
核心思想:一个类实现接口的主要目的:把其中的方法都实现了(检测方法)
完全面向对象 代码实现统一,实现解耦*/
//1、接口类---Class Interface ===>实例化N多个接口
/**
*接口类的参数?几个
* 参数1:接口名
* 参数2:接收方法的集合(数组)
*/
var Interface = function(name , methods){
//判断接口的参数个数
if (arguments.length !=2) {
throw new Error('the instance interface constructor arguments should be 2');
};
this.name =name;
//this.methods = methods;
this.methods = [];
for (var i = 0, len = methods.length; i <len; i++) {
if (typeof methods[i] !== "string"){
throw new Error('the name of method is wrong');
}
this.methods.push(methods[i]);
}
}
//2、准备工作,具体的实现
//(1)实例化接口对象
var CompositeInterface = new Interface('CompositeInterface',['add','delete']);
var FormItemInterface = new Interface('FormItemInterface',['update','select']);
//(2)具体的实现类
//CompositeImpl implments CompositionIterface FormItemIterface
var CompositeImpl = function(){
}
//(3)实现接口的方法 implements methods
CompositeImpl.prototype.add = function(obj){
alert("add");
}
CompositeImpl.prototype.delete = function(obj){
alert("delete");
}
CompositeImpl.prototype.update = function(obj){
alert("update");
}
/*CompositeImpl.prototype.select = function(obj){
alert("select");
}*/
//3、检验接口里的方法
//如果检测通过,不做任何操作;不通过,则抛出异常。
//这个方法的目的就是 检测方法的
Interface.ensureImplements =function(object){
//如果接受参数长度小于2 ,证明还有任何实现的接口
if (arguments.length < 2) {
throw new Error('The Interface has no implement class');
};
//获得接口的实例对象
for (var i = 1, len= arguments.length; i < len; i++) {
var instanceInterface =arguments[i];
//判断参数是否为 接口类的类型
if (instanceInterface.constructor !==Interface) {
throw new Error('The arguments constructor is not Interface Class');
};
for (var j = 0, len2 =instanceInterface.methods.length ; j <len2; j++ ) {
//用一个临时变量 ,接收每个方法的名字(注意为字符串类型)
var methodName = instanceInterface.methods[j];
//object[key] 获得方法
if (!object[methodName] || typeof object[methodName] !== 'function')
{
throw new Error('the method"'+ methodName+'"is not found');
}
}
}
}
var c1 =new CompositeImpl();
Interface.ensureImplements(c1,CompositeInterface,FormItemInterface);
c1.add();
var ResultFormatter =function(resultsObject){
if(!(resultsObject instanceof TestResult)){
throw newError("ResultsFormatter:constructor requires an instance of TestResult asan argument.")
}
this.resultsObject = resultsObject;
}
ResultFormatter.prototype.renderResults =function(){
var dateOfTest = this.resultsObject.getDate();
var resultsArray =this.resultsObject.getResults();
var resultsContainer =document.createElement('div');
var resultsHeader =document.createElement("h3");
resultsHeader.innerHTML = "TestResults from "+dateOfTest.toUTCString();
resultsContainer.appendChild(resultsHeader);
var resultList =document.createElement("ul");
resultsContainer.appendChild(resultList);
for(var i=0,len=resultsArray.length;i<len;i++){
var listItem=document.createElement('li');
listItem.innerHTML =resultsArray[i];
resultList.appendChild(listItem);
}
return resultsContainer;
}
//ResultSetInterface. var ResultSet =new Interface(“ResultSet”,[‘getDate','getResults']);
var ResultFormatter = function(resultsObject){
Interface.ensureImplements(resultsObject,ResultSet);
this.resultsObject = resultsObject;
}
ResultFormatter.prototype.renderResults= function(){
…
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有