ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 어뎁터(Adapter) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:36

    Pattern #9  어뎁터 패턴




     어플리케이션의 기능을 외부에서 필요한 형태로 수정하여 사용하도록 함


     

     패턴 요약 
      - 원하는 인터페이스를 추상 클래스로 정의
      - 이를 상속하는 어뎁터 클래스를 만들고 이를 요구하는 기능을 가진 클래스(adaptee)와 메시지를 교환하게 함


     
     동기

      

      당신은 금융권 전산화 시스템 개발팀의 일원으로, 통신보안 관련 쪽 개발을 맡았다. 개발 기간이 빠듯하긴 하지만 다행히 다른 프로젝트를 수행할 때 개발해 놓은 통신보안 코드들이 있어서 일정을 맞출 수 있을 것 같다. 그런데 한가지 문제점은, 예전 프로젝트 때 개발된 통신보안 코드들은 A사의 통신 보안 프로토콜 Library를 사용하는데 비하여, 새 프로젝트에서는 B사의 통신 보안 프로토콜 Library를 사용하도록 결정되었다. 재사용하려는 통신 보안 코드들을 전면적으로 수정하지 않고 A사의 Library를 B사의 Library로 대체할 수 있는 방법은 없을까??

       






     



    일반적 접근 방법
     - 기존의 Client Code 내에서 A Library 부분을 모두 B Library로 대체하고, A Protocol객체의 함수 호출부분을 B Protocol객체의 함수 호출로 바꾼다.




     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // 기존 Client Code
    #include “AProtocol.h”
    AProtocol proto;
    proto.connect(“xyz.com”,50);
    proto.send(msg);
    … 
    proto.receive(msg);
    … 
    proto.disconnect();
    cs

     

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // 수정된 Client Code
    #include “BProtocol.h”
    BProtocol proto;
    proto.setTarget(“xyz.com”,50);
    proto.open();
    proto.write(msg)
    ;… 
    proto.read(msg);
    … 
    proto.close();
    cs

     







    문제점
     - 기존 Client 코드 전체에 산재해 있는 A Library관련 코드를 모두 수정해야 한다.
     






    해결 방안
     - 기존 Client Code를 그대로 재사용하기 위해서 B Protocol 인터페이스를 A Protocol의 인터페이스로 변환하는 것이 필요하다.
     - B Protocol 코드를 직접 변경할 수는 없으므로, Client Code와 B Protocol 사이에 중재자 역할을 하는 새로운 클래스를 작성한다.














     








     구조




     






    의도
     - 특정 클래스의 인터페이스를 클라이언트가 원하는 인터페이스로 변환한다.


    별명
     - Wrapper


    적용 분야
     - 기존에 존재하는 클래스를 재사용하고 싶지만, 원하는 인터페이스와 맞지 않을 때
     - 미리 정해져 있지 않은 클래스들과 상호 작용할 수 있는 재사용 가능 클래스를 만들려는 경우






    예제




    Volt.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    package adapter;
     
    public class Volt {
        private int volts;
     
        public Volt(int volts) {
            this.volts = volts;
        }
     
        public int getVolts() {
            return volts;
        }
     
        public void setVolts(int volts) {
            this.volts = volts;
        }
     
    }
     
    cs





    Socket.java



     

    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    package adapter;
     
    public class Socket {
        public Volt getVolt() {
            return new Volt(120);
        }
    }
     
    cs




    SocketAdapter.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    package adapter;
     
    public interface SocketAdapter {
        public Volt get120Volt();
     
        public Volt get12Volt();
     
        public Volt get3Volt();
    }
     
    cs





    SocketClassAdapterImpl.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    package adapter;
     
    public class SocketClassAdapterImpl extends Socket implements SocketAdapter {
     
        public Volt get120Volt() {
            return getVolt();
        }
     
        public Volt get12Volt() {
            Volt v = getVolt();
            return convertVolt(v, 10);
        }
     
        public Volt get3Volt() {
            Volt v = getVolt();
            return convertVolt(v, 40);
        }
     
        private Volt convertVolt(Volt v, int i) {
            return new Volt(v.getVolts() / i);
        }
     
    }
     
    cs




    SocketObjectAdapterImpl.java


     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    package adapter;
     
    public class SocketObjectAdapterImpl implements SocketAdapter {
     
        private Socket sock = new Socket();
     
        public Volt get120Volt() {
            return sock.getVolt();
        }
     
        public Volt get12Volt() {
            Volt v = sock.getVolt();
            return convertVolt(v, 10);
        }
     
        public Volt get3Volt() {
            Volt v = sock.getVolt();
            return convertVolt(v, 40);
        }
     
        private Volt convertVolt(Volt v, int i) {
            return new Volt(v.getVolts() / i);
        }
     
    }
     
    cs






    AdapterMain.java



     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    package adapter;
     
    public class AdapterMain {
     
        public static void main(String[] args) {
            testClassAdapter();
            testObjectAdapter();
        }
     
        private static void testObjectAdapter() {
            SocketAdapter sockAdapter = new SocketObjectAdapterImpl();
            Volt v3 = getVolt(sockAdapter, 3);
            Volt v12 = getVolt(sockAdapter, 12);
            Volt v120 = getVolt(sockAdapter, 120);
     
            System.out.println("v3 volts using Object Adapter = " + v3.getVolts());
            System.out
                    .println("v12 volts using Object Adapter = " + v12.getVolts());
            System.out.println("v120 volts using Object Adapter = "
                    + v120.getVolts());
     
        }
     
        private static void testClassAdapter() {
            SocketAdapter sockAdapter = new SocketClassAdapterImpl();
            Volt v3 = getVolt(sockAdapter, 3);
            Volt v12 = getVolt(sockAdapter, 12);
            Volt v120 = getVolt(sockAdapter, 120);
     
            System.out.println("v3 volts using Class Adapter = " + v3.getVolts());
            System.out.println("v12 volts using Class Adapter = " + v12.getVolts());
            System.out.println("v120 volts using Class Adapter = "
                    + v120.getVolts());
     
        }
     
        private static Volt getVolt(SocketAdapter sockAdapter, int i) {
            switch (i) {
            case 3:
                return sockAdapter.get3Volt();
            case 12:
                return sockAdapter.get12Volt();
            case 120:
                return sockAdapter.get120Volt();
            default:
                return sockAdapter.get120Volt();
            }
        }
     
    }
     
    cs








     


    댓글

Designed by Tistory.