CodeGym/Java Blog/무작위의/어댑터 디자인 패턴
John Squirrels
레벨 41
San Francisco

어댑터 디자인 패턴

무작위의 그룹에 게시되었습니다
회원
안녕! 오늘 우리는 중요한 새로운 주제인 디자인 패턴을 다룰 것입니다 . 이 패턴은 무엇입니까? 나는 당신이 " 바퀴를 재발명하지 말라 " 는 표현을 알아야 한다고 생각합니다 . 프로그래밍에는 다른 많은 영역과 마찬가지로 많은 공통 상황이 있습니다. 소프트웨어 개발이 발전함에 따라 각 소프트웨어에 대해 작동하는 기성 솔루션이 만들어졌습니다. 이러한 솔루션을 디자인 패턴이라고 합니다. 일반적으로 패턴은 다음과 같이 공식화된 솔루션입니다. "프로그램에서 X를 수행해야 하는 경우 이것이 가장 좋은 방법입니다." 많은 패턴이 있습니다. 반드시 숙지해야 할 훌륭한 책인 "Head First Design Patterns"가 그들에게 헌정되었습니다. 어댑터 디자인 패턴 - 2요컨대 패턴은 일반적인 문제와 일종의 표준이라고 할 수 있는 해당 솔루션으로 구성됩니다. 오늘 수업에서는 다음 패턴 중 하나를 만납니다. 어댑터. 이름에서 알 수 있듯이 실생활에서 어댑터를 여러 번 접했습니다. 가장 일반적인 어댑터 중 일부는 많은 컴퓨터와 랩톱에 있는 카드 판독기입니다. 어댑터 디자인 패턴 - 3일종의 메모리 카드가 있다고 가정합니다. 그래서 문제가 무엇입니까? 컴퓨터와 상호 작용하는 방법을 모릅니다. 공통 인터페이스를 공유하지 않습니다. 컴퓨터에 USB 포트가 있지만 메모리 카드를 삽입할 수 없습니다. 카드를 컴퓨터에 연결할 수 없으므로 사진, 비디오 및 기타 데이터를 저장할 수 없습니다. 카드 리더기는 이 문제를 해결하는 어댑터입니다. 결국, 그것은 USB 케이블이 있습니다! 카드 자체와 달리 카드 리더기는 컴퓨터에 연결할 수 있습니다. 컴퓨터와 공통 인터페이스인 USB를 공유합니다. 이것이 실제로 어떻게 보이는지 봅시다:
public interface USB {

   void connectWithUsbCable();
}
이것은 USB를 통해 연결하는 단 하나의 방법이 있는 USB 인터페이스입니다.
public class MemoryCard {

   public void insert() {
       System.out.println("Memory card successfully inserted!");
   }

   public void copyData() {
       System.out.println("The data has been copied to the computer!");
   }
}
이것은 메모리 카드를 나타내는 클래스입니다. 이미 우리에게 필요한 2가지 방법이 있지만 여기에 문제가 있습니다. USB 인터페이스를 구현하지 않습니다. 카드를 USB 포트에 삽입할 수 없습니다.
public class CardReader implements USB {

   private MemoryCard memoryCard;

   public CardReader(MemoryCard memoryCard) {
       this.memoryCard = memoryCard;
   }

   @Override
   public void connectWithUsbCable() {
       this.memoryCard.insert();
       this.memoryCard.copyData();
   }
}
그리고 여기 어댑터가 있습니다! 무엇을CardReader클래스는 무엇이며 정확히 어댑터로 만드는 것은 무엇입니까? 모두 간단합니다. 적응되는 클래스(MemoryCard)는 어댑터의 필드 중 하나가 됩니다. 이것은 의미가 있습니다. 실생활에서 메모리 카드를 카드 리더기에 넣으면 메모리 카드도 그 일부가 됩니다. 메모리 카드와 달리 어댑터는 컴퓨터와 인터페이스를 공유합니다. USB 케이블이 있습니다. 즉, USB를 통해 다른 장치에 연결할 수 있습니다. 이것이 우리의 CardReader 클래스가 USB 인터페이스를 구현하는 이유입니다. 하지만 이 메서드 내에서 정확히 어떤 일이 발생할까요? 정확히 우리가 일어나야 할 일입니다! 어댑터는 작업을 메모리 카드에 위임합니다. 실제로 어댑터 자체는 아무 것도 수행하지 않습니다. 카드 리더에는 독립적인 기능이 없습니다. 그 역할은 카드가 작업을 수행할 수 있도록 컴퓨터와 메모리 카드를 연결하는 것입니다. 바로 파일 복사입니다!connectWithUsbCable()방법) 메모리 카드의 "요구 사항"을 충족합니다. 메모리 카드에서 데이터를 복사하려는 사람을 시뮬레이트할 클라이언트 프로그램을 만들어 봅시다.
public class Main {

   public static void main(String[] args) {

       USB cardReader = new CardReader(new MemoryCard());
       cardReader.connectWithUsbCable();
   }
}
그래서 우리는 무엇을 얻었습니까? 콘솔 출력:
Memory card successfully inserted!
The data has been copied to the computer!
훌륭한. 우리는 목표를 달성했습니다! 다음은 어댑터 패턴에 대한 정보가 있는 비디오 링크입니다.

Reader 및 Writer 추상 클래스

이제 우리가 가장 좋아하는 활동으로 돌아가겠습니다: 입력 및 출력 작업을 위한 몇 가지 새로운 클래스에 대해 배우겠습니다 :) 우리가 이미 얼마나 많은 것을 배웠는지 궁금합니다. Reader 오늘은 및 클래스 에 대해 이야기하겠습니다 Writer. 왜 구체적으로 그 수업? 어댑터에 대한 이전 섹션과 관련이 있기 때문입니다. 더 자세히 살펴 보겠습니다. 부터 시작하겠습니다  Reader. Reader추상 클래스이므로 객체를 명시적으로 생성할 수 없습니다.   그러나 당신은 실제로 이미 그것에 익숙합니다! 결국, 당신은 그 자손인 BufferedReader및 클래스에 대해 잘 알고 있을 것입니다 :)InputStreamReader
public class BufferedReader extends Reader {}

public class InputStreamReader extends Reader {}
클래스 InputStreamReader는 클래식 어댑터입니다. 기억하시겠지만 InputStream객체를 생성자에게 전달할 수 있습니다. 이를 위해 일반적으로 System.in변수를 사용합니다.
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
하지만 무엇 InputStreamReader을합니까? 모든 어댑터와 마찬가지로 하나의 인터페이스를 다른 인터페이스로 변환합니다.  이 경우 InputStream인터페이스에 대한 인터페이스입니다 Reader. 처음에는 클래스가 있습니다 InputStream. 잘 작동하지만 개별 바이트를 읽는 데만 사용할 수 있습니다. 또한 Reader추상 클래스가 있습니다. 몇 가지 매우 유용한 기능이 있습니다. 문자를 읽는 방법을 알고 있습니다! 우리는 확실히 이 능력이 필요합니다. 그러나 여기서 우리는 일반적으로 어댑터에 의해 해결되는 고전적인 문제인 호환되지 않는 인터페이스에 직면합니다. 그게 무슨 뜻이야? Oracle 설명서를 살펴보겠습니다. 다음은 클래스의 메서드입니다 InputStream. 어댑터 디자인 패턴 - 4일련의 메서드는 정확히 인터페이스입니다. 보시다시피 이 클래스는read()방법(실제로 몇 가지 변형)이지만 바이트만 읽을 수 있습니다: 개별 바이트 또는 버퍼를 사용하는 여러 바이트. 그러나이 옵션은 우리에게 적합하지 않습니다. 우리는 문자를 읽고 싶습니다. 추상 클래스 에 이미 구현된Reader 기능이 필요합니다 . 문서에서도 이를 확인할 수 있습니다. 어댑터 디자인 패턴 - 5그러나 InputStream및  Reader인터페이스는 호환되지 않습니다! 보시다시피 read()메서드의 모든 구현에는 서로 다른 매개 변수와 반환 값이 있습니다. 그리고 이것이 우리가 필요한 곳입니다 InputStreamReader! 클래스 간의 어댑터 역할을 합니다 .위에서 고려한 카드 판독기의 예에서와 같이 적응되는 클래스의 인스턴스를 어댑터 클래스 "내부"에 넣습니다. 즉, 하나를 생성자에게 전달합니다. 앞의 예에서는 MemoryCard객체를 안에 넣습니다 CardReader. InputStream 이제 객체를 생성자에 전달합니다 InputStreamReader! 익숙한 System.in변수를 다음과 같이 사용합니다 InputStream.
public static void main(String[] args) {

   InputStreamReader inputStreamReader = new InputStreamReader(System.in);
}
그리고 실제로 에 대한 문서를 보면 InputStreamReader적응이 성공했음을 알 수 있습니다 :) 이제 문자를 읽을 수 있는 방법이 있습니다. 어댑터 디자인 패턴 - 6그리고 우리의 System.in개체(키보드에 바인딩된 스트림)가 처음에는 이를 허용하지 않았지만 언어 작성자는 어댑터 패턴을 구현하여 이 문제를 해결했습니다. 대부분의 I/O 클래스와 마찬가지로 추상 Reader클래스에는 쌍둥이 형제가 있습니다  Writer. Reader 그것은 문자 작업을 위한 편리한 인터페이스를 제공한다는 것과 같은 큰 장점을 가지고 있습니다  . 출력 스트림을 사용하면 문제와 솔루션이 입력 스트림과 동일하게 보입니다. OutputStream바이트만 쓸 수 있는 클래스가 있습니다.Writer문자로 작업하는 방법을 알고 있는 추상 클래스와 호환되지 않는 두 개의 인터페이스가 있습니다. 이 문제는 어댑터 패턴으로 다시 한 번 해결됩니다. 우리는 클래스를 사용하여  및   클래스의 두 인터페이스를 서로 OutputStreamWriter쉽게 적응시킵니다 . 바이트 스트림을 생성자에 전달한 후 an을 사용하여 바이트가 아닌 문자를 쓸 수 있습니다! WriterOutputStreamOutputStreamOutputStreamWriter
import java.io.*;

public class Main {

   public static void main(String[] args) throws IOException {

       OutputStreamWriter streamWriter = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Username\\Desktop\\test.txt"));
       streamWriter.write(32144);
       streamWriter.close();
   }
}
코드 32144(綐)로 문자를 파일에 작성하여 바이트로 작업할 필요가 없습니다 :) 오늘은 여기까지입니다. 다음 수업에서 만나요! :)
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다