Java Adapter 어댑터 모드(클래스 어댑터, 객체 어댑터)의 장단점 비교

Java 어댑터 모드
최근에 자바 기초 지식을 배우고 어댑터를 배울 때 의혹이 많습니다. 인터넷에서 자료를 찾아보면 Adapter에 대한 자료가 많지만 다음 편과 비교하면 괜찮습니다. 여기에 기록되어 있습니다. 여러분이 필요로 하는 것을 보실 수 있습니다.
어댑터 모드는 하나의 클래스의 인터페이스를 클라이언트가 기대하는 다른 인터페이스로 바꾸어 원래의 인터페이스가 일치하지 않아 함께 작업할 수 없는 두 클래스가 함께 작업할 수 있도록 하는 것이다.기능적으로 말하자면, 이러한 인터페이스가 호환되지 않는 종류는 일반적으로 같거나 비슷한 기능을 가지고 있다.일반적으로 우리는 이 종류의 인터페이스를 수정함으로써 이런 인터페이스가 호환되지 않는 상황을 해결하지만, 만약 우리가 하나의 응용을 위해 각 원본 인터페이스를 수정하고 싶지 않거나, 우리가 전혀 대상의 원본 코드가 없을 때, 어댑터 모드가 유용하게 쓰일 것이다.
어댑터의 장점:
1. 목표 클래스와 적합자 클래스를 결합시킨다
2. 클래스의 투명성과 복용성을 증가시키고 구체적인 실현을 적합자 클래스에 봉인하여 클라이언트 클래스에 투명하고 적합자의 복용성을 높인다
3. 유연성과 확장성이 뛰어나 개폐 원칙에 부합
어댑터에 포함된 역할은 다음과 같습니다.
대상(Target): 클라이언트가 사용하는 특정 인터페이스를 정의합니다.
클라이언트(Client): 대상 인터페이스를 사용하여 대상 인터페이스와 일치하는 객체와 협력합니다.
어댑터(Adaptee): 현재 어댑터가 필요한 인터페이스입니다.
어댑터(Adapter): Adaptee 인터페이스를 Target 인터페이스로 변환합니다.어댑터는 구체적인 종류로 이 모델의 핵심이다.
어댑터는 클래스 어댑터와 대상 어댑터 두 가지로 나뉘는데 아래에 상세하게 설명할 것이다.
클래스 어댑터
클래스 어댑터라는 것은 어댑터 Adapter가 우리의 피적응자 Adaptee를 계승하고 목표 인터페이스 Target을 실현하는 것을 가리킨다.Java는 단일 상속이기 때문에 이 어댑터는 상속된 어댑터 Adaptee에만 서비스를 제공할 수 있습니다.코드는 다음과 같습니다.
어댑터(Adaptee)

package com.bluemsun.classadapter;

public class Person {
  private int id;
  private String name;
  /**
   * person 
   */
  public void sayEnglish(){
    System.out.println("Person can say english!");
  }
  
  /**
   *  setter,getter.
   */
}
대상 인터페이스(Target)

package com.bluemsun.classadapter;

/**
 *  person , , . person 
 * @author Administrator
 *
 */
public interface Target_Person {
  void sayEnglish();
  void sayFrench();
  void sayJapanese();
}
어댑터(Adapter)

package com.bluemsun.classadapter;

/**
 *  , Person, Java , person 
 *  person 
 * @author Administrator
 *
 */
public class Adapter_Person extends Person implements Target_Person{

  @Override
  public void sayFrench() {
    System.out.println("Person can say French!");
  }

  @Override
  public void sayJapanese() {
    System.out.println("Person can say Japanese!");
  }
}
클라이언트(Client)

package com.bluemsun.classadapter;

public class Test {
  public static void main(String[] args) {
    Target_Person person = new Adapter_Person();
    
    person.sayEnglish();
    person.sayFrench();
    person.sayJapanese();
  }
}
위의 몇 단락의 간단한 코드는 클래스 어댑터의 작용을 보여 준다.우리가 말한 바와 같이 이 어댑터 Adapter는 Person이라는 클래스에만 서비스를 제공할 수 있습니다.이럴 때 내가 적당한 클래스가 많으면 적당한 클래스마다 Adapter를 써야 하지 않겠냐고 생각할 수도 있다.좀 더 유연한 방법이 있을까요?답은: 네!바로 우리가 아래에 말한 대상 어댑터다.
객체 어댑터
대상 어댑터라는 것은 간단하게 말하자면 어댑터가 우리의 목표 인터페이스를 실현하지만 적합한 종류를 계승하지 않는다.어댑터의 구조 함수에서 적합해야 할 클래스를 전달함으로써 적합하게 한다.코드는 다음과 같습니다.
어댑터(Adapter)

package com.bluemsun.objectdapter;

import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;

/**
 *  , : 
 * @author Administrator
 *
 */
public class Adapter_Person implements Target_Person{  // 
  private Person person;
  
  // Adaptee Person 
  public Adapter_Person(Person person){
    this.person = person;
  }

  // sayEnglish()-- Adaptee sayEnglish()
  @Override
  public void sayEnglish() {
    this.person.sayEnglish();
  }

  // 
  @Override
  public void sayFrench() {
    System.out.println("person can say French!");
  }

  @Override
  public void sayJapanese() {
    System.out.println("person can say Japanese!");
  }
}
클라이언트(Client)

package com.bluemsun.objectdapter;

import com.bluemsun.classadapter.Person;
import com.bluemsun.classadapter.Target_Person;

public class Test {
  public static void main(String[] args) {
    Target_Person person = new Adapter_Person(new Person());
    
    person.sayEnglish();
    person.sayFrench();
    person.sayJapanese();
  }
}
객체 어댑터는 여러 개의 적합한 클래스를 사용할 수 있습니다.Adapter의 구성 방법에서 서로 다른 적합한 클래스를 전달하기만 하면 됩니다.융통성이 있다.
클래스 어댑터의 장점:
1. 어댑터 클래스는 어댑터 클래스의 하위 클래스이기 때문에 어댑터 클래스에서 어댑터의 유연성을 더욱 높일 수 있다.
클래스 어댑터의 단점:
1. Java, C# 등 다중 계승을 지원하지 않는 언어는 한 번에 최대 한 개의 어댑터 클래스만 적합할 수 있고 목표 추상 클래스는 인터페이스만 있고 클래스가 될 수 없다. 그 사용은 어느 정도 한계가 있고 어댑터 클래스와 그의 하위 클래스를 목표 인터페이스에 동시에 적합하게 할 수 없다.
객체 어댑터의 이점:
1. 여러 개의 서로 다른 어댑터를 같은 목표에 맞춘다. 즉, 같은 어댑터는 어댑터와 그의 하위 클래스를 모두 목표 인터페이스에 맞출 수 있다.
객체 어댑터의 단점:
1. 클래스 어댑터 모드에 비해 적합자 클래스를 바꾸는 방법은 쉽지 않다.
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기