어댑터 패턴

이성준·2023년 2월 17일
1

Design Pattern

목록 보기
1/1

충전기라는 역할을 만들기 위해 Charger 인터페이스를 만들었습니다.

public interface Charger {
	void charge();
}

충전기 역할을 맡을려면 충전을 무조건 할 줄 알아야하니까
충전이란 행동을 정의해줍시다.

그리고 이 충전기 역할을 구현하는 구현체 두개 CType케이블과 라이트닝 케이블을 만들어 줍니다.

public class CType implements Charger {

	@Override
	public void charge() {
		System.out.println("충전중");
	}
}
public class LightingCable implements Charger {

	@Override
	public void charge() {
		System.out.println("충전중");
	}
}

그리고 각각의 인터페이스들을 구현하는 구현체를 만들어 줍시다.

public class 갤럭시기본CType충전기 implements CType{
	@Override
	public void charge() {
		System.out.println("충전중");
	}

}
public class 아이폰기본라이트닝충전기 implements LightingCable {

	@Override
	public void charge() {
		System.out.print("충전중입니다.");
	}
}

그리고 아이폰객체를 만들어줍니다.

public class IPhone {
	public void charge(LightingCable charger){
			charger.charge();
	}
}

보니까 충전기를 라이트닝케이블으로만 받고있네요. 다르게 말하면, 라이트닝케이블객체하고만 협력할 수 있다네요.

아이폰객체와 C타입객체를 만들어서 한번 충전시켜보겠습니다.

역시 예상대로 타입이 안맞다고 컴파일 자체가 안되네요.

그러면 어떻게 해야 좋을까요?

어댑터 패턴

위키백과에 보면

어댑터 패턴(Adapter pattern)은 클래스의 인터페이스를 사용자가 기대하는 다른 인터페이스로 변환하는 패턴으로, 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해준다.

아이폰객체는 LightningCable역할을 구현한 구현체하고만 협력하길 원하는데 우리가 가진건 CType역할의 구현체밖에 없으니 어댑터 패턴을 써서 CType인터페이스를 LightningCable인터페이스로 변환하는 어댑터를 만들어 아이폰과 LightningCable이 협력할 수 있게 해줍시다.

public class CTypeToLightningAdapter implements LightingCable{

	private CType cType;

	public CTypeToLightningAdapter(CType cType) {
		this.cType = cType;
	}

	@Override
	public void charge() {
		cType.charge();
	}
}
public class App {
	public static void main(String[] args) {
		IPhone phone = new IPhone();
		CType cType = new 갤럭시기본CType충전기();
		phone.charge(new CTypeToLightningAdapter(cType));
	}
}


어댑터에 끼워서 꽂았으니 컴파일에러도 안생기고 충전중이라는 글자가 잘 뜨네요.

  1. 이제 5핀 충전기오든 30핀 충전기가 오든 아이폰객체는 바뀔 일이 없으니 자연스럽게 개방 폐쇄 역할을 잘 지키게 됐습니다.
  2. 아이폰 객체는 라이트닝케이블 역할만 구현하는 구현체만 받는 책임만 가지고 있는데 어떤 충전기가 와도 어댑터 만들어서 끼워주면 되니 단일 책임 원칙을 더 잘 지키게 되었습니다.

0개의 댓글