GoF 디자인패턴 - Adapter

Clean Code Big Poo·2025년 6월 3일
0
post-thumbnail

Overview

디자인패턴 시작하기를 보고 정리하기

Adapter

원하는 형태로 변환해 주는 장치. 어떤 클래스에 대한 코드를 변경할 수 없는 상황에서 수정을 대신 해주는 클래스

다이어그램

  • Tiger 코드가 변경이 불가능하다면?
    Animal 클래스처럼 사용하고 싶으면 어떻게 해야할까?

  • TigerAdapter : Animal 를 상속받음. Tiger 객체를 필드로 가짐. Animal 과 Tiger 를 연결하는 패턴

구현 코드

Animal.java

public abstract class Animal {
    protected String name;

    public Animal(String name){
        this.name = name;
    }

    public abstract void sound();
}

Dog.java

public class Dog  extends  Animal{

    public Dog(String name) {
        super(name);
    }

    @Override
    public void sound() {
        System.out.println(name+": Barking");
    }
}

Cat.java

public class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }

    @Override
    public void sound() {
        System.out.println(name+": Meow");
    }
}

Tiger.java

public class Tiger {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    void roar(){
        System.out.println("Growl");
    }
}

TigerAdapter.java

Animal 을 상속받고, Tiger 객체를 필드에 선언한다.
그후, Animal 구조에 맞도록 tiger 객체에 데이터 set/get 한다.

public class TigerAdapter extends Animal{
    private Tiger tiger;

    public TigerAdapter(String name) {
        super(name);

        tiger = new Tiger();
        tiger.setName(name);
    }

    @Override
    public void sound() {
        System.out.print(name+": ");
        tiger.roar();
    }
}

User.java

import java.util.ArrayList;

public class User {

    public static void main(String[] args){
        ArrayList<Animal> animals = new ArrayList<Animal>();

        animals.add(new Dog("댕이"));
        animals.add(new Cat("냥이"));
        animals.add(new Cat("츄르"));
        // animals.add(new Tiger("어흥"));//타입 불일치로 사용 불가

        animals.add(new TigerAdapter("어흥"));

        animals.forEach(Animal::sound);
    }
}

0개의 댓글