var cardMain = function(id){
this.cards = [];
this.element = document.createElement("div");
this.element.id = id;
Interface.regImplement(this,IcardItem);
};
cardMain.prototype = {
add:function(카드){
this.cards.push(카드);
this.element.appendChild(card.getElement());
},
remove:function(card){
for(i=0;len=this.cards.length,iif(cards[i] == 카드){
this.cards.splice(i,1);
휴식;
}
this.element.removeChild(card.getElement());
}
},
getChild:function(i){
return this.cards[i];
},
getElement:function(){
return this.element;
},
showBank:function(){
this.element.style.display ="block";
for(i=0;len=this.cards.length,ithis.cards[i].showBank();
}
},
hideBank:function(){
this.element.style.display ="none";
for(i=0;len=this.cards.length,ithis.cards[i].hideBank();
}
}
};
然后결정义叶子对象类bankLogo사용以创建银行logo,这里银行logoduc以带class的a标签标识:
varbankLogo = function(bankClassName){
this.element = document.createElement("a");
this.element.className = 은행클래스이름;
Interface.regImplement(this,IcardItem);
};
bankLogo.prototype ={
showBank:function(){
this.element.style.display ="block";
},
hideBank:function(){
this.element.style.display ="none";
},
getElement:function(){
return this.element;
}
};
最后设置一个单体对象,将操作银行的个模块,方便调用:
var BankAction ={
bankList:[],
addBank:function(card){
this.bankList.push(card) ;
},
innerBank:function(conId){
for(i=0;len=this.bankList.length,ivar cardObj =this.bankList[i ].getElement();
}
document.getElementById(conId).appendChild(cardObj);
}
};
到了实现环节了,实例化生成一个包含所有卡的最外层容器,然后根据,卡类分别生成一个放置银行卡와卡은 일반적으로 즐거운 여행이며, 最后生成各银行卡的实例,并按层级关系shape成DOM结构:
var 은행 DivT = new cardMain("PayCard");//创建最외부层容器
var ebankCard = new cardMain("ebankCard");//创建网银类银行卡容器
var ktCard = new cardMain("ktCard" );//创建卡通类银行卡容器
var ccbBank = newbankLogo('Ebank-CMB');//创建招行银行卡
var abcBank = newbankLogo('Ebank-ABC');//创建农行银行卡
var abcKtBank = newbankLogo('Kt-ABC');//创建卡通农行卡
ebankCard.add(ccbBank);
ebankCard.add(abcBank);
ktCard.add(abcKtBank);
bankDivT.add(ebankCard);
bankDivT.add(ktCard);
BankAction.addBank(bankDivT);
BankAction.innerBank("bankList");
将动态生成银行列表, DOM结构形如:
조합 모드 애플리케이션은 사용자 인터페이스를 동적으로 생성할 때 매우 좋은 선택입니다. 응집력 있는 코드를 크게 단순화하고 유지 관리성을 향상시킬 수 있습니다. 그러나 결국 리프 개체가 많은 경우에도 재귀에는 성능 문제가 있으므로 주의해서 사용해야 합니다.
자바스크립트 디자인 패턴의 데코레이터 패턴
데코레이터 패턴: 새 하위 클래스를 만들지 않고도 객체에 대한 새 함수를 만들 수 있습니다. 예: 잔액 결제와 결합된 Alipay 체크아웃 빨간 봉투의 애플리케이션 시나리오입니다.
var Ieconomics = new Interface("ieconomics",[["getPrice"]]);
먼저 컴포넌트 클래스를 생성하고, 컴포넌트를 기반으로 인스턴스화된 객체가 데코레이터 클래스에 매개변수로 전달됩니다. 데코레이터가 구성 요소의 다양한 메서드를 호출할 수 있도록 합니다.
vareconomic = function(){
Interface.regImplement(this,Ieconomics);
economic.prototype={
getPrice:function(){
//코드 구현
}
그런 다음 파생 데코레이터 옵션 클래스의 상위 클래스로 데코레이터 추상 클래스를 만듭니다.
vareconomicsDecorator = function(economic){ this.economic =economic;
this.regImplement(economic,Ieconomics)
}; EconomicsDecorator.prototype={
getPrice:function(){
return this.economic.getPrice();
}
}
마지막으로 위 내용을 바탕으로 추상 클래스, 파생 데코레이터 옵션 클래스 생성:
var 쿠폰 = function(economic){ //추상 클래스로 장식된 생성자 호출
economicsDecorator.call(this,economic)
}; 🎜>extend( 쿠폰, 쿠폰Decorator);
coupon.prototype=function(){
//getPrice 메소드 다시 작성
getPrice:function(){
return this.economic.getPrice() - this.getCoupon() ;
},
getCoupon:function(){
//빨간 봉투의 총 가격을 가져오는 구체적인 구현
}
}; myCoupon = neweconomic();
myCoupon = new 쿠폰(myCoupon);
먼저 myCoupon 구성요소의 인스턴스를 구현하는 것은 매우 간단합니다. 데코레이터 옵션 클래스 쿠폰에 대한 매개변수로 개체를 지정합니다. 두 코드 줄 모두에서 myCoupon 변수에 값을 할당했음을 알 수 있습니다. 이는 둘 다 동일한 인터페이스 클래스를 구현하고 서로 바꿔 사용할 수 있기 때문입니다.
이것을 본 주의깊은 학생들은 쿠폰 클래스에 getCoupon 메소드를 추가했음을 알 수 있을 것입니다. 현재로서는 문제가 없지만 계속해서 쇼핑 쿠폰 데코레이터 옵션 클래스를 생성한 다음 빨간색을 사용하면 어떨까요? 봉투를 같이?
코드 복사
extend(voucher,couponDecorator) voucher.prototype=function(){
getPrice :function(){
return this.getPrice() - this.getVoucher();
},
getVoucher:function(){
//총 가격을 가져오는 구체적인 구현 쿠폰
}
};
var myCoupon = neweconomic();
myCoupon = 새 쿠폰(myCoupon)
myCoupon = 새 쿠폰(myCoupon);
여기서 이 시나리오에서는 getCoupon 메소드를 더 이상 찾을 수 없습니다. 이는 바우처가 myCoupon을 장식할 때 해당 상위 클래스인economicsDecorator에 getCoupon 메소드가 포함되어 있지 않기 때문에 당연히 얻을 수 없기 때문입니다.
데코레이터 추상 클래스인economicsDecorator를 분석하여 myCoupon에 대한 참조를 매개변수로 전달하고 이 매개변수를 사용하여 몇 가지 작은 작업을 수행하고 새로 추가된 메서드를 얻을 수 있습니다.
코드 복사
코드는 다음과 같습니다.
vareconomicsDecorator = function(economic){
this.economic =economic;
this.interface = Ieconomics;
for(var k in this.economic){
if( typeof this.economic[key] !== "function"){
continue;
var i
for(i = 0;len = this.interface.methods.length,i < len; i ) {
//이 메소드가 인터페이스 클래스에 포함되어 있는지 비교하여 포함되어 있으면 다음 메소드를 반환
if(key == this.interface.methods[i][0] ) {
break ;
}
}
if(i < this.interface.methods.length)
continue
var decorator = this
//정의됨 익명 함수 호출 새 메소드 사용
(function(methodName) {
decorator[methodName] = function() {
return decorator.economic[methodName]();
};
}) (키);
}
}
this.regImplement(economic,Ieconomics)
}
economicsDecorator.prototype={
getPrice:function(){
return this.economic.getPrice();
}
};
위 코드를 보면 데코레이터 추상 클래스를 일부 수정했습니다. 옵션 클래스에 새 메소드가 정의되면 데코레이터 추상 클래스에서 동적으로 정의될 수 있습니다. 다음은 데코레이터 패턴 사용에 대한 아이디어입니다. 프로젝트가 아직 개발 중이기 때문에 데모는 아직 제공되지 않습니다. 상세한 디자인을 당신과 함께합니다.
Javascript 디자인 패턴의 브리지 모드
브리지 모드: 추상화와 구현을 분리하여 독립적으로 변경할 수 있습니다. 실제로 이는 매우 간단합니다. API와 특정 이벤트 사이에 브리지를 추가하여 API와 이를 사용하는 클래스 및 개체 간의 결합을 줄입니다.
사실 브릿지 모드는 대부분의 학생들에게 낯설지 않습니다. 다음 this.getName은 브릿지 메소드로 내부 프라이빗 변수에 액세스하여 구현됩니다. 외부 커뮤니케이션과 내부 커뮤니케이션을 연결하는 다리.
var ioldfish = function(){
var name = 'Old Fish';
this.getName = function(){
alert(name);
}
}
가장 일반적으로 사용되는 브리지 모드는 이벤트 리스너 콜백 함수입니다. 사용자 정보를 얻기 위한 API 인터페이스 함수는 다음과 같습니다.
function getUserInfo(userid,callback){
asyncRequest('GET','userInfo?userid=' userid,function(resp){
callback(resp.responseText);
})
}
다음으로 해야 할 일은 이 API와 이벤트 트리거 사이의 브리지 관계를 설정하는 것입니다.
addEvent(element,'click',bridgeMethod); function bridgeMethod(e) {
getUserInfo(this.userid,function(){
//콜백 함수 구현 코드
})
}
요소가 클릭된 객체는 getIserInfo가 아니지만 새로운 브리지 메소드인 bridgeMethod가 생성됩니다. 이러한 브리징 계층을 통해 API 인터페이스 기능과 클릭 이벤트가 상대적으로 독립적이므로 API 적용 범위가 크게 넓어집니다.
Javascript 디자인 패턴 어댑터 패턴
어댑터 패턴: 예를 들어 시스템을 유지 관리합니다. 이전에는 항상 프로토타입 프레임워크를 사용했지만 이제는 두 프레임워크 간에 전환하는 방법을 도입할 계획입니다.
, 예를 들어 프로토타입의 $ 메소드를 YUI의 get 메소드로 변환하는 방법:
function $(){}; function YAHOO.util.Dom.get=function(el){};
function 프로토타입ToYuiAdapter(){
return YAHOO .util.Dom.get(인수)
}
프로토타입에서 yui의 get 메소드를 사용하려면 다음 문만 작성하면 됩니다.
$ = 프로토타입ToYuiAdapter;
이 경우 프로토타입에서 YUI의 get 메소드를 사용할 수 있습니다. 저는 이 모델을 별로 좋아하지 않기 때문에 자세히 설명하지는 않겠습니다. 사실 저는 이 모델을 사용할 필요가 전혀 없다고 생각합니다. 이 모드를 사용하지 않으려면 절박한 상황에서 임시 솔루션으로만 사용할 수 있습니다.
자바스크립트 디자인 패턴 파사드 모드, 관찰자 모드
파사드 모드: 모든 스크립트 프레임워크에서 사용해야 합니다. 프레임워크에 정의된 메소드를 찾아 살펴보세요. YUI 등의 setStyle 메소드로 사용됩니다. 여기서는 자세히 설명할 것이 없습니다.
관찰자 패턴: JavaScript에서 이 디자인 패턴을 적용하는 것은 더 무리한 것 같습니다. 따라서 다른 사람들이 오해할 수 있는 내용을 피하기 위해 여기서는 다루지 않겠습니다. 조언 좀 부탁드립니다.
이 블로그 포스팅을 하루 종일 했는데, 아직 쓰고 싶은 게 많은 것 같습니다. 마음속에 있는 내용을 깔끔하게 정리하기가 쉽지 않은 것 같습니다. 나중에, 계속 지켜봐 주시기 바랍니다!