As i wish

[Design pattern] Adapter pattern (어댑터패턴) 본문

Design Pattern

[Design pattern] Adapter pattern (어댑터패턴)

어면태 2019. 4. 22. 00:24

오늘은 어댑터 패턴에 대하여 포스팅 해보겠습니다.

어댑터 패턴 이란...

클래스의 인터페시으를 클라이언트에서 요구하는 다른 인터페이스로 변환합니다. 인터페이스가 호환되지 않아 쓸 수 없었던 클래스들을 같이 사용할 수 있게 해줍니다.

쉽게 생각해서 어댑터로 생각하면 됩니다.
출처: https://www.javagists.com/adapter-design-pattern

클라이언트는 타겟 인터페이스에 맞게 구현되어 있습니다.

어댑터는 타겟 인터페이스를 구현하며, 여기에는 어댑티 인스턴스가 들어있습니다.

 

즉, 클라이언트에서 타겟 인터페이스를 사용하여 메소드를 호출함으로써 어댑터에 요청을 합니다.

그럼 어댑터에서는 어댑티 인터페이스를 사용하여 그 요청을 어댑티에 대한 매소드 호출로 변환하죠.

마지막으로 클라이언트에서는 호출 결과를 받긴 하지만 중간에 어댑터가 껴 있는지는 알지 못하죠.

 

역시 코드로 설명하면 아주 가뿐합니다!!

# -*- coding: utf-8 -*-
# Adapter Pattern
 
import abc

class Duck:
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def quack(self):
    pass

  @abc.abstractmethod
  def fly(self):
    pass

class MallardDuck(Duck):
  def quack(self):
    print ("Quack")

  def fly(self):
    print ("I'm flying")

class Turkey:
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def gobble(self):
    pass

  @abc.abstractmethod
  def fly(self):
    pass 

class WildTurkey(Turkey):
  def gobble(self):
    print ("Gobble gobble")

  def fly(self):
    print ("I'm flying a short distance")

class TurkeyAdapter(Duck):
  def __init__(self, adaptee):
    self.turkey = adaptee

  def quack(self):
    self.turkey.gobble()

  def fly(self):
    self.turkey.fly()
    self.turkey.fly()
    self.turkey.fly()

def testDuck(duck):
  duck.quack()
  duck.fly()

duck = MallardDuck()
turkey = WildTurkey()
turkeyAdapter = TurkeyAdapter(turkey)

print ("The turkey says...")
turkey.gobble()
turkey.fly()
print("The duck says...")
testDuck(duck)
print("The duck says...")
testDuck(turkeyAdapter)


 

클라이언트에 타겟 인터페이스는 아마 testDuck 에 duck 인터페이스고,

어댑터는 TurkeyAdapter 가 되겠고

어댑티는 Turkey 가 될 수 있겠죠?

이렇게 함으로서 클라이언트와 구현된 인터페이스를 분리시킬 수 있으며, 나중에 인터페이스가 바뀌더라도 그 변경 내역은 어댑터에 캡슐화 되기 때문에 클라이언트는 바뀔 필요가 없겠죠

결과창!!!

Comments