1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title>javascript高级语法15-适配器模式</title>
6 </head>
7 <body>
8 <script type="text/javascript">
9 /*适配器是为了解决已有接口有的类不兼容问题
10 * 类似于门面模式,但是机理是完全不同的
11 * 门面模式为了简化接口,使调用者更加方便
12 * 适配器是为了解决接口不兼容的问题
13 */
14
15 //接口
16 var Interface = function(name,methods){
17 if(arguments.length != 2){
18 alert("interface must have two paramters...");
19 }
20 this.name = name;//这个是接口的名字
21 this.methods = [];//定义个空数组来转载函数名
22 for (var i = 0; i < methods.length; i++) {
23 if(typeof methods[i] != "string"){
24 alert("method name must is String ...")
25 }else{
26 this.methods.push(methods[i])
27 }
28 }
29 }
30 //定义接口的一个静态方法来实现接口与实现类的直接检验
31 //静态方法不要写成Interface.prototype.* 因为这是写到接口原型连上的
32 //我们要把静态的函数直接写到类层次上
33 Interface.ensureImplements = function(object){
34 if(arguments.length<2){
35 alert("必须最少是2个参数");
36 return false;
37 }
38 //遍历
39 for (var i = 1; i < arguments.length; i++) {
40 var inter = arguments[i];
41 //如果你是接口就必须是Interface类型的
42 if(inter.constructor != Interface){
43 throw new Error("if is interface class must is Interface type");
44 }
45 //遍历函数集合并分析
46 for (var j = 0; j < inter.methods.length; j++) {
47 var method = inter.methods[j];
48 //实现类中必须有方法名字 和 接口中所有的方法名项目
49 if(!object[method] || typeof object[method] != "function"){
50 throw new Error("实现类并没有完全实现接口中的所有方法...");
51 }
52 }
53 }
54 }
55 function demo(){
56 //例如你已经写好一个应用API
57 //程序员依托 PcatV1版本来写客户端
58 var PcatV1Lib = new Interface("PcatV1Lib",["add"]);
59 function plib(){
60 this.add = function(x,y){
61 return x+y;
62 }
63 Interface.ensureImplements(this,PcatV1Lib);
64 }
65 //客户端
66 var lib = new plib();
67 //调用
68 alert(lib.add(1,3));
69
70 //现在需要更换类库,但是前台写好的程序,不希望有大的变化
71 var PcatV2 = new Interface("PcatV1Lib",['add']);
72 function p2lib(){
73 this.add = function(list){
74 return eval(list.join("+"));
75 }
76 Interface.ensureImplements(this,PcatV1Lib);
77 }
78 //客户端
79 var lib = new p2lib();
80 //调用
81 //alert(lib.add(1,3)); 这时候不能这么调用了。
82 //利用适配器来解决问题
83 //添加适配器
84 var wrapper = new Interface("PcatV1Lib",['add']);
85 function wrapperpcat2lib(){
86 this.add = function(x,y){
87 var arr = new Array();
88 arr.push(x);
89 arr.push(y);
90 return new p2lib().add(arr);
91 }
92 }
93 lib = new wrapperpcat2lib()
94 alert(lib.add(5,5))
95 /*利用适配器就可以完成客户端代码不变的情况下改变类库
96 *但是这种情况只有客户端代码是标准的时候才可以
97 * 否则直接修改客户端也是一个不错的选择。
98 */
99 }
100 demo();
101 </script>
102 </body>
103 </html>