정의
어댑터 모드 (어댑터)는 클래스 (개체)의 인터페이스 (메소드 또는 속성)를 고객이 원하는 다른 인터페이스 (메소드 또는 속성)로 변환하는 것입니다. 어댑터 모드를 사용하면 인터페이스의 비 호환성으로 인해 원래 함께 작동 할 수없는 클래스 (객체)를 허용합니다. 빠른 포장지.
어댑터의 별칭은 래퍼이며 비교적 간단한 패턴입니다. 프로그램 개발에는 이러한 시나리오가 많이 있습니다. 모듈 또는 객체의 인터페이스를 호출하려고 할 때이 인터페이스의 형식이 현재 요구 사항을 충족하지 못한다는 것을 알 수 있습니다. 현재 두 가지 솔루션이 있습니다. 첫 번째는 원래 인터페이스 구현을 수정하는 것이지만 원래 모듈이 매우 복잡하거나 우리가 얻는 모듈이 다른 사람이 작성한 압축 코드 인 경우 원래 인터페이스를 수정하는 것은 비현실적입니다. 두 번째 방법은 어댑터를 만들고 원래 인터페이스를 고객이 원하는 다른 인터페이스로 변환하는 것입니다. 고객은 어댑터 만 처리하면됩니다.
어댑터 모드를 사용해야하는 이유는 무엇입니까?
응용 프로그램을 개발할 때는 종종 응용 프로그램의 일부 (예 : 로그 또는 유사한 컨텐츠를 보유하는 데 사용하는 라이브러리)를 교체해야합니다. 새 라이브러리로 교체 할 때 새 라이브러리가 동일한 인터페이스를 가질 가능성은 낮습니다. 여기에서 두 가지 옵션이 있습니다.
(1) 모든 코드를 확인하고 모든 코드를 이전 라이브러리로 변경하십시오.
(2) 새 라이브러리가 이전 라이브러리와 동일한 인터페이스를 사용할 수 있도록 어댑터를 만듭니다.
분명히, 어떤 경우에는 응용 프로그램이 작거나 이전 라이브러리에 대한 참조가 거의없는 경우 전체 코드를 확인하고 코드를 더 복잡하게 만들기 위해 새로운 추상화 레이어를 추가하는 대신 새 라이브러리와 일치하도록 변경하는 것이 더 적절합니다. 그러나 대부분의 경우 어댑터를 만드는 것이 더 실용적이고 시간 절약입니다.
JavaScript 코드 예제
무언가가 일어날 수 있으면 확실히 일어날 것입니다. 먼저이 작은 loggerfactory를 살펴보면 더 쉽게 사용하는 로그 인터페이스를 수정할 수 있습니다.
var loggerFactory = {getLogger : function () {return swooind.console; }, ...};/* 사용 예 예 :/var logger = loggerfactory.getLogger (); logger.log ( "something to log");GetLogger를 호출하면 콘솔 객체 (콘솔)를 반환합니다. 이 연습에서는 콘솔 객체에 하나의 메소드 만 로그를 가지고 있으며 하나의 문자열 유형 매개 변수 만 수신 할 수 있습니다. 다음으로, 우리는 또 다른 로그 인터페이스를 가지고 있는데, 1) 브라우저 자체가 아닌 콘솔과 달리 JavaScript로 구현되기 때문에 더 복잡합니다. 2) AJAX를 통해 로그를 서버로 전송합니다. 이는 URL 데이터를 인코딩해야 함을 의미합니다 (코드는 우리가 말하려는 어댑터 패턴과 관련이 없기 때문에 URL 인코딩 관련 문제를 구체적으로 구현하지 않습니다). 물론 콘솔과 다른 인터페이스를 사용합니다.
var ajaxlogger = {sendlog : function () {var data = this.urlencode (arguments); jQuery.ajax ({url : "http://example.com/log", data : data}); }, urlencode : function (arg) {... return encodedData; }, ...};우리는 jQuery의 Ajax 요청을 사용하여 주로 시간을 절약하고 어댑터 모드와 관련이없는 것들을 무시했습니다. 우리가 지금해야 할 일은 어댑터를 만들고 이전 LoggerFactory를 변경하여 콘솔 객체 대신이 어댑터를 반환하는 것입니다.
var ajaxloggeradapter = {log : function (arg) {ajaxlogger.sendlog (arg); }};/ * LoggerFactory 조정 */var loggerFactory = {getLogger : function () {// 반환 값 변경 ajaxLoggerAdapter; }, ...};기존 코드를 한 줄만 변경했으며 전체 프로그램 이이 새로운 로그 인터페이스를 사용할 수 있습니다.
복잡한 어댑터
로그 인터페이스는 매우 간단한 예입니다. 하나의 방법 만 가지고 있으며 이전 방법에 직접 매핑하는 것은 어렵지 않습니다. 대부분의 경우에는 그렇지 않습니다. 이러한 매핑 된 함수의 매개 변수가 완전히 다르고 이전 인터페이스에는 이러한 매개 변수가 전혀 없을 수 있으며 직접 처리해야 할 수도 있습니다. 경우에 따라 새 인터페이스가 전혀 사용하지 않기 때문에 일부 매개 변수를 삭제해야합니다. 두 객체 사이의 인터페이스 매핑이 너무 어려운 경우 다른 방법을 생각해야합니다. 어쨌든 수천 줄의 오래된 코드를 찾고 수정하고 싶지 않습니다.