디자인 패턴

어댑터 패턴과 퍼사드 패턴

그zi운아이 2023. 11. 24. 21:20

1. 어댑터 패턴

어댑터 패턴이란 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이이스로 변환하는 것으로 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와줍니다.

 

객체 어댑터 패턴

  • 객체 어댑터 패턴은 구성을 사용한다. 이는 어댑터가 기존 클래스의 인스턴스를 내부적으로 가지고 있으며, 이 인스턴스를 통해 메서드를 호출한다.
  • 객체 어댑터는 유연성을 가지고, 한 어댑터를 여러 다른 어댑터를 여러 다른 클래스와 연결하거나 동시에 여러 인터페이스를 구현할 수 있다.
public class ObjectAdapter implements TargetInterface {
    private Adaptee adaptee;

    public ObjectAdapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        adaptee.specificRequest();
    }
}

 

클래스 어댑터 패턴

  • 클래스 어댑터는 상속을 사용한다. 어댑터가 기존 클래스를 상속받고 대상 인터페이스도 구현한다. 이는 다중 상속을 지원하지 않는 자바에서는 사용될 수 없다.
  • 기존 클래스의 메서드를 직접 상속받으므로 옵라이드하거나 확장할 수 있다
class ClassAdapter : public TargetInterface, private Adaptee {
    public:
        void request() override {
            specificRequest();
        }
};

 

객체 어댑터를 실전에 적용한다고 생각해봤을떄 DataSource와 DriverManager가 생각이 났다.

public class DriverManagerDataSourceAdapter implements DataSource {
    private String url;
    private String username;
    private String password;

    public DriverManagerDataSourceAdapter(String url, String username, String password) {
        this.url = url;
        this.username = username;
        this.password = password;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

    @Override
    public Connection getConnection(String username, String password) throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }




public class Application {
    public static void main(String[] args) {
        DataSource dataSource = new DriverManagerDataSourceAdapter(
            "jdbc:mysql://localhost:3306/mydb", "username", "password");

        try (Connection connection = dataSource.getConnection()) {
        } catch (SQLException e) {
           throw new CustomException(e)
        }
    }
}

2. 퍼사드 패턴

퍼사드 패턴은 서브시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어준다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편리하게 사용할 수 있다. 복잡한 서브시스템 또는 라이브러리를 단순화된 인터페이스 뒤에 숨겨 클라이언트에게 쉽게 접근할 수 있도록 하는 디자인 패턴이다.

 

퍼싸드 패턴의 예시

컴퓨터를 켜는 것은 단순한 행위처럼 보이지만, 실제로는 매우 복잡한 과정이 진행된다. 컴퓨터의 시동 과정은 CPU 초기화, 메모리 검사, 장치 드라이버 로드, 운영 체제 부팅 등 여러 단계를 포함한다. 사용자 입장에서 이 모든 복잡한 과정을 이해하고 실행할 필요없고 "파워 버튼"은 이 모든 복잡한 시동 과정을 단순화된 인터페이스로 제공하는 퍼사드의 역할을 한다.

 

class CPU {
    void initialize() {
        System.out.println("CPU 초기화 중...");
    }
    void execute() {
        System.out.println("프로그램 실행 중...");
    }
}

class Memory {
    void load() {
        System.out.println("메모리에 데이터 로드 중...");
    }
}

class HardDrive {
    void read() {
        System.out.println("하드 드라이브에서 데이터 읽는 중...");
    }
}



class ComputerFacade {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;

    public ComputerFacade() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }

    public void start() {
        cpu.initialize();
        memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
        cpu.execute();
    }

    private static final long BOOT_ADDRESS = 0x0000;
    private static final long BOOT_SECTOR = 0x0000;
    private static final int SECTOR_SIZE = 512;
}
class ComputerFacade {
    private CPU cpu;
    private Memory memory;
    private HardDrive hardDrive;

    public ComputerFacade() {
        this.cpu = new CPU();
        this.memory = new Memory();
        this.hardDrive = new HardDrive();
    }

    public void start() {
        cpu.initialize();
        memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
        cpu.execute();
    }

    private static final long BOOT_ADDRESS = 0x0000;
    private static final long BOOT_SECTOR = 0x0000;
    private static final int SECTOR_SIZE = 512;
}
public class Main {
    public static void main(String[] args) {
        ComputerFacade computer = new ComputerFacade();
        computer.start();
    }
}

 

ComputerFacade 클래스는 컴퓨터의 복접한 시동 과정을 start 메소드 하나로 단 순화합니다. 클라이언트는 ComputerFacade를 통해 간단히 컴퓨터를 시작할 수 있으며 내부적으로는 CPU초기화,메모리 로드,하드 드라이브 읽기 등의 복잡한 과정이 진행됩니다.

'디자인 패턴' 카테고리의 다른 글

전략 패턴 ( Strategy Pattern )  (0) 2023.10.18