소프트웨어에 대한 모든 것

[디자인패턴][Adapter] 어댑터 패턴 본문

시스템 설계 및 디자인/디자인 패턴

[디자인패턴][Adapter] 어댑터 패턴

앤테바 2022. 3. 30. 07:43
반응형

어댑터 패턴 정의

  • 호환성이 없는 기존 클래스의 인터페이스를 변환하여 사용자가 기대하는 인터페이스 형태로 변환시키는 패턴
  • 코드의 재활용성을 증가하고 기존의 코드를 수정하지 않는 장점이 있음

어댑터 패턴 언제 사용?

  • 외부 구성 요소를 기존 시스템에 재사용하고 싶지만 호환되지 않는 경우
  • 애플리케이션이 클라이언트가 기대하는 인터페이스와 호환되지 않는 경우
  • 원본 코드를 수정하지 않고 애플리케이션에서 레거시 코드를 재사용하려는 경우

어댑터 패턴 클래스 다이어그램

Adapter 패턴 Class Diagram

어댑터 패턴 활용

기존 시스템에 Fighter 인터페이스가 있고 이를 상속 받은 Warrior 클래스가 있습니다. attack(), defend(), escape() 오퍼레이션을 지원합니다. 외부에서 Wizard(마법사) 클래스는 이미 만들어져 있었습니다. 이를 기존의 Fighter와 동일한 인터페이스로 사용하기 위해서 어댑터 패턴을 적용합니다.

 

Fighter 클래스를 상속받은 WizardAdapter 클래스를 하나 생성하고 WizardAdapter를 Wizard를 멤버 변수로 갖습니다. Fighter의 attack(), defend(), escape()가 호출되면 Wizard의 shot_fire_ball(), shield(), portral()을 호출하면 됩니다. Wizard 클래스가 추가가 되었지만 코드의 변경없이 WizardAdapter 클래스를 추가 함으로서 기존 시스템 동일한 인터페이스로 Wizard를 사용할 수 있게 되었습니다. 객체 지향 5대 원칙 중 OCP(개방폐쇄원칙)을 충실히 따른 것이라 할 수 있습니다.

from abc import ABC, abstractmethod


class Fighter(ABC):
    @abstractmethod
    def attack(self): pass

    @abstractmethod
    def defend(self): pass

    @abstractmethod
    def escape(self): pass


class Warrior(Fighter):
    def attack(self):
        print('칼을 휘두르다')

    def defend(self):
        print('방패를 들어올니다')

    def escape(self):
        print('뒤로 물러난다')


class WizardAdapter(Fighter):
    def __init__(self, wizard):
        self.wizard = wizard

    def attack(self):
        self.wizard.shot_fire_ball()

    def defend(self):
        self.wizard.shield()

    def escape(self):
        self.wizard.portal()


class Wizard:
    def shot_fire_ball(self):
        print('파이어볼 발사')

    def shield(self):
        print('주변에 보호막 씌우기')

    def portal(self):
        print('포탈 열고 이동')


wizard = WizardAdapter(Wizard())
wizard.attack()
wizard.defend()
wizard.escape()

출력

파이어볼 발사
주변에 보호막 씌우기
포탈 열고 이동

 

 

함께 보면 좋은 글

2022.03.23 - [시스템 설계 및 디자인/객체지향 SOLID] - [디자인패턴][SOLID] 개방/폐쇄 원칙

 

[디자인패턴][SOLID] 개방/폐쇄 원칙

개방/폐쇄 원칙 (Open-closed principle) 클래스는 확정에는 열려있고 수정에는 닫혀 있어야 한다. 개방/폐쇄 원칙은 기존의 시스템의 존재하는 코드의 수정없이 새로운 features(or use cases)를 쉽게 추가

wellsw.tistory.com

 

참고 자료

https://refactoring.guru/design-patterns/adapter

https://www.tutorialspoint.com/design_pattern/adapter_pattern.htm

https://www.baeldung.com/java-adapter-pattern

https://javarevisited.blogspot.com/2016/08/adapter-design-pattern-in-java-example.html#axzz7Oxw2Wens

반응형
Comments