JS設計モードのアダプターモード
6237 ワード
アダプタモードは、既存のインターフェースと互換性のないクラスとインターフェースとの間で適応されます.別のオブジェクトを新しいコネクタで包装します.
アダプターは二つの異なるインターフェースを調整するために使用されます.見栄パターンとの違い:
外観パターンは簡単なインターフェースであり、コードとインターフェースだけが簡略化された役割を果たし、追加の選択は提供されない.
アダプターモードは一つのインターフェースを別のインターフェースに変換し、インターフェースを完全に保持し、インタフェースを簡単にしない必要があります.
例:
アダプターは現在の条件の下で、フレームが次々と現れて、また統一していない情況の下で、大規模なコードを書き換えることを免れて、新しいインターフェイスで不適当なインターフェースを包装して、文法の違いを調整します.
アダプターは二つの異なるインターフェースを調整するために使用されます.見栄パターンとの違い:
外観パターンは簡単なインターフェースであり、コードとインターフェースだけが簡略化された役割を果たし、追加の選択は提供されない.
アダプターモードは一つのインターフェースを別のインターフェースに変換し、インターフェースを完全に保持し、インタフェースを簡単にしない必要があります.
var clientObject={
string1:'foo',
string2:'bar',
string3:'baz'
};
function interfaceMethod(str1,str2,str3){
...
}
function clientToInterfaceAdapter(o){
interfaceMethod(o.str1,o.str2,o.str3);
}
clientToInterfaceAdapter(clientObject);
clientObjectをパラメータとしてinterfaceMethodに渡すには、アダプターが必要です.例:
function $(){
var elements=[];
for(var i=0;i
$関数のパラメータは1つ以上とすることができますが、get関数は1つしかなく、文字列、HTML要素、または文字列とHTML要素からなる配列とすることができます.この二つの方法は以下の通りです.function $ToGet(){
return get(arguments);
}
function GetTo$(el){
return $.apply(window,el instanceof Array?el:[el]);
}
例:電子メールAPIに適合する
function $(id){
return typeof id == 'string'?document.getElementById(id):id;
}
function getElementsByClass(){
var ele = [];
function getClassElement(className,el){
var ob = [];
el = el||document;
var nodes = el.getElementsByTagName('*');
for(var i=0, len=nodes.length; i < len; i++){
if(nodes[i].className == className)
ob.push(nodes[i]);
}
return ob;
}
if(arguments.length == 1){
return getClassElement(arguments[0]);
}else{
var prev = getClassElement(arguments[0]),next = [];
for(var j = 0, length = prev.length; j < length; j++){
var r = getClassElement(arguments[1], prev[j]);
next=next.concat(r);
}
return next;
}
}
function addEvent(node, type, fn){
if(node.addEventListener){
node.addEventListener(type, fn, false);
}else if(node.attachEvent){
node.attachEvent('on'+type,fn)
}else{
node['on'+type] = fn;
}
}
var DED = {};
DED.util = {
substitute:function (s, o){
return s.replace(/{([^{}]*)}/g,function (a, b){
var r = o[b];
return typeof r == 'string' ||typeof r == 'number' ? r : a;
});
},
asyncRequest:(function(){
function handleReadyState(o, callback) {
var poll = window.setInterval(function(){
if(o&&o.readyState == 4){
window.clearInterval(poll);
if(callback)
callback(o);
}
},50);
}
var getXHR = function(){
var http;
try {
http = new XMLHttpRequest;
getXHR = function(){
return new XMLHttpRequest;
};
}
catch(e) {
var msxml = [
'MSXML2.XMLHTTP.3.0',
'MSXML2.XMLHTTP',
'Microsoft.XMLHTTP'
];
for(var i = 0, len = msxml.length; i < len; ++i){
try{
http = new ActiveXObject(msxml[i]);
getXHR = function() {
return new ActiveXObject(msxml[i]);
};
break;
}
catch(e){}
}
}
return http;
};
return function(method, uri, callback, postData){
var http = getXHR();
http.open(method, uri, true);
handleReadyState(http, callback);
http.send(postData || null);
return http;
};
})()
};
var dedMail = (function(){
function request(id, type, callback){
DED.util.asyncRequest(
'GET',
'new/index',
function(o) {
callback(o.responseText);
}
);
}
return {
getMail: function(id, callback){
request(id, 'all', callback);
},
sendMail: function(body, recipient){
},
save: function(id) {
},
move: function(id, destination){
},
archive: function(id) {
},
trash: function(id) {
},
reportSpam: function(id) {
},
formatMessage: function(e) {
var e = e || window.event;
try {
e.preventDefault();
}
catch(ex) {
e.returnValue = false;
}
var targetEl = e.target || e.srcElement;
var id = targetEl.id.toString().split('-')[1];
dedMail.getMail(id, function(msgObject) {
var resp = eval('('+msgObject+')');
var details = '<p><strong>From:</strong>{from}<br>';
details += '<strong>Sent:</strong>{date}</p>';
details += '<p><strong>Message</strong><br>';
details += '{message}</p>';
$('message-pane').innerHTML = DED.util.substitute(details, resp);
});
}
};
})();
addEvent(window, 'load', function(){
var threads = getElementsByClass('thread', 'a');
for(var i = 0, len=threads.length; i<len; i++){
addEvent(threads[i], 'click', dedMail.formatMessage);
}
});
var fooMail = {}
//fooMail.getMail ID
//function(text){ $('message-pane').innerHTML =text;}
var dedMailToFoolMail = {};
dedMailToFoolMail.getMail = function(id, callback){
dedMail.getMail(id, function(msgObject) {
var resp = eval('('+msgObject+')');
var details = '<p><strong>From:</strong>{from}<br>';
details += '<strong>Sent:</strong>{date}</p>';
details += '<p><strong>Message</strong><br>';
details += '{message}</p>';
callback(DED.util.substitute(details, resp));
});
};
fooMail = dedMailToFoolMail;
fooMail.getMail("a",function(text){$('message-pane').innerHTML=text;});
Email Application Interface
この例は,インターフェースタイプが異なる場合,インターフェースの汎用性を達成することにより,コードの多重量を増加させることを明らかに示している.アダプターは現在の条件の下で、フレームが次々と現れて、また統一していない情況の下で、大規模なコードを書き換えることを免れて、新しいインターフェイスで不適当なインターフェースを包装して、文法の違いを調整します.