JavaScript设计模式-15.适配器模式
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>javascript高级语法15-适配器模式</title>
</head>
<body>
<script type="text/javascript">
/*适配器是为了解决已有接口有的类不兼容问题
* 类似于门面模式,但是机理是完全不同的
* 门面模式为了简化接口,使调用者更加方便
* 适配器是为了解决接口不兼容的问题
*/ //接口
var Interface = function(name,methods){
if(arguments.length != 2){
alert("interface must have two paramters...");
}
this.name = name;//这个是接口的名字
this.methods = [];//定义个空数组来转载函数名
for (var i = 0; i < methods.length; i++) {
if(typeof methods[i] != "string"){
alert("method name must is String ...")
}else{
this.methods.push(methods[i])
}
}
}
//定义接口的一个静态方法来实现接口与实现类的直接检验
//静态方法不要写成Interface.prototype.* 因为这是写到接口原型连上的
//我们要把静态的函数直接写到类层次上
Interface.ensureImplements = function(object){
if(arguments.length<2){
alert("必须最少是2个参数");
return false;
}
//遍历
for (var i = 1; i < arguments.length; i++) {
var inter = arguments[i];
//如果你是接口就必须是Interface类型的
if(inter.constructor != Interface){
throw new Error("if is interface class must is Interface type");
}
//遍历函数集合并分析
for (var j = 0; j < inter.methods.length; j++) {
var method = inter.methods[j];
//实现类中必须有方法名字 和 接口中所有的方法名项目
if(!object[method] || typeof object[method] != "function"){
throw new Error("实现类并没有完全实现接口中的所有方法...");
}
}
}
}
function demo(){
//例如你已经写好一个应用API
//程序员依托 PcatV1版本来写客户端
var PcatV1Lib = new Interface("PcatV1Lib",["add"]);
function plib(){
this.add = function(x,y){
return x+y;
}
Interface.ensureImplements(this,PcatV1Lib);
}
//客户端
var lib = new plib();
//调用
alert(lib.add(1,3)); //现在需要更换类库,但是前台写好的程序,不希望有大的变化
var PcatV2 = new Interface("PcatV1Lib",['add']);
function p2lib(){
this.add = function(list){
return eval(list.join("+"));
}
Interface.ensureImplements(this,PcatV1Lib);
}
//客户端
var lib = new p2lib();
//调用
//alert(lib.add(1,3)); 这时候不能这么调用了。
//利用适配器来解决问题
//添加适配器
var wrapper = new Interface("PcatV1Lib",['add']);
function wrapperpcat2lib(){
this.add = function(x,y){
var arr = new Array();
arr.push(x);
arr.push(y);
return new p2lib().add(arr);
}
}
lib = new wrapperpcat2lib()
alert(lib.add(5,5))
/*利用适配器就可以完成客户端代码不变的情况下改变类库
*但是这种情况只有客户端代码是标准的时候才可以
* 否则直接修改客户端也是一个不错的选择。
*/
}
demo();
</script>
</body>
</html>
JavaScript设计模式-15.适配器模式的更多相关文章
- 再起航,我的学习笔记之JavaScript设计模式12(适配器模式)
适配器模式 适配器模式(Adapter): 将一个类(对象)的接口(方法或属性)转化成为另外一个接口,使类(对象)之间接口的不兼容问题通过适配器得以解决. 适配相似的框架 不知道大家有没有遇到过这种场 ...
- 再起航,我的学习笔记之JavaScript设计模式15(组合模式)
组合模式 组合模式(Composite): 又称部分-整体模式,将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 如果有一个 ...
- JavaScript设计模式 Item9 --适配器模式Adapter
适配器模式(转换器面模式),通常是为要使用的接口,不符本应用或本系统使用,而需引入的中间适配层类或对象的情况. 适配器模式的作用是解决两个软件实体间的接口不兼容的问题. 一.定义 适配器模式(Adap ...
- javascript设计模式之适配器模式
---恢复内容开始--- 定义: 是指讲一个接口转换成客户端希望 的另外一个接口,该模式使得原本不兼容的类可以一起工作.适配器模式的作用事解决两个软件实体间的接口不兼容的问题. 生活中的实例: USB ...
- 【读书笔记】读《JavaScript设计模式》之适配器模式
一.定义 适配器模式可用来在现有接口和不兼容的类之间进行匹配.使用这种模式的对象又叫包装器(wrapper),因为它们是在用一个新的接口包装另一个对象.在设计类的时候旺旺会遇到有些接口不能与现有API ...
- 15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码)
15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码) 前言 设计模式是一个程序员进阶高级的必备技巧,也是评判一个工程师工作经验和能力的试金石.设计模式是程序员多年工作经 ...
- 转载,javascript 设计模式
了解JavaScript设计模式我们需要知道的一些必要知识点:(内容相对基础,高手请跳过) 闭包:关于闭包这个月在园子里有几篇不错的分享了,在这我也从最实际的地方出发,说说我的理解. 1.闭包最常用的 ...
- 《Javascript设计模式与开发实践》--读书笔记
第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...
- 21种JavaScript设计模式最新记录(含图和示例)
最近观看了<Javascript设计模式系统讲解与应用>教程,对设计模式有了新的认识,特在此做些记录. 一.UML 文中会涉及众多的UML类图,在开篇需要做点基础概念的认识.以下面的图为例 ...
随机推荐
- 开源应用框架BitAdminCore:更新日志20180817
索引 NET Core应用框架之BitAdminCore框架应用篇系列 框架演示:http://bit.bitdao.cn 框架源码:https://github.com/chenyinxin/coo ...
- Impala源码之订阅发布系统的实现
本文由 网易云发布. 作者:冯宇 本篇文章仅限内部分享,如需转载,请联系网易获取授权. 本文是Impala源码笔记的第一篇,本文主要根据源代码学习一下statestored模块的实现,众所周知,Im ...
- 大公司怎么做Android代码混淆的?
3月17日,网易资深安全工程师钟亚平在安卓巴士全球开发者论坛上做了<安卓APP逆向与保护>的演讲.其中就谈到了关于代码混淆的问题.现摘取部分重点介绍如下: Java代码是非常容易反编译 ...
- Android : M 与 N 的权限管理
从 M 开始,permission 分为 Normal permission Runtime permission Normal permission 直接在 manifest 里声明就可以用了. a ...
- GO语言官方中文教程!
官方中文教程网址:https://tour.go-zh.org/basics/1 推荐理由:简洁,一句废话没有,对于初学者可以让大家快速掌握GO语言! 注意问题:如果不能访问,你懂的! 教程截图:
- “全栈2019”Java多线程第十章:Thread.State线程状态详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第七章:等待线程死亡join()方法详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 关于字典的几个类--defaultdict,OrderedDict, zip()
一. 1个键对应多个值 比如:d = {'a' : [1, 2, 3], 'b' : [4, 5]},可以使用 collections 模块中的 defaultdict 来构造这样的字典 from ...
- django model改变后,同步数据库
在使用django进行开发时,往往需要根据不同的需求对model进行更改.而这时候,python manage.py syncdb就不好使了. 目前有个很好的工具,是south,这个是专门用来更改mo ...
- SaltStack Pillar 详解
简介 grains用于存储静态不易变更的数据,而pillar一般用于存储动态, 敏感的数据,通过minion和master设置或获取grains信息,而pillar信息只能在master端配置,在到m ...