본문 바로가기
ComputerScience/SoftwareEngineering

[SoftwareEngineering] 2. 디자인 패턴 - 구조

by Develaniper 2021. 6. 5.

2. 구조(Structural) 패턴

1) 어댑터 패턴

 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. 즉, 호환성 문제를 해결하기 인터페이스를 사용하여 같이 쓸 수 없는 클래스들을 연결해서 사용하는 것이다.

 

Dog(interface) - Poodle(class)

public interface Dog{
    public void walk();
    public void bark();
}

public class Pooddle implements Dog{
    @Override
    public void bark() {
        System.out.println("멍멍멍");
    }
    @Override
    public void walk() {
        System.out.println("산책가자 멍!");
        
    }
}

 

Cat(interface) - RussianBlue(class) -  CatAdapter

public interface Cat{
    public void walk();
    public void meow();
}

public class RussianBlue implements Cat{
    @Override
    public void meow() {
        System.out.println("야옹");
    }
    @Override
    public void walk() {
        System.out.println("집에서만 걷겠다 냥");
        
    }
}

public class CatAdapter implements Dog{
    private Cat cat;
    public CatAdapter(Cat cat){
        this.cat = cat;
    }
    @Override
    public void bark() {
        cat.meow();        
    }
    @Override
    public void walk() {
        cat.walk();
    }
}

Main

public class Main{
    public static void main(String[] args) {
        Cat cat = new RussianBlue();
        Dog dog = new Pooddle();
        CatAdapter catAdapter = new CatAdapter(cat);

        behaivorDog(dog);
        behaivorDog(catAdapter);
        //behaivorDog(cat); -> 에러

    }
    static void behaivorDog(Dog dog){
        dog.walk();
        dog.bark();
    }
}

 

CatAdapter가 Dog의 구현체로써 Cat을 받아 Dog의 역할에 매칭해주는 어댑터 역할을 하고 있다.

 

2) 프록시 패턴

  • 실제 기능을 수행하는 객체 대신 가상의 객체를 이용해 로직의 흐름을 제어하는 디자인 패턴으로  일을 대신하는 객체를 만드는 패턴이다.
  • 흐름을 제어하기 위해 사용되고 결과값을 조작하거나 변경시키면 안된다.
  • 클라이언트가 어떤 객체를 통해 메서드를 호출하고 반환 값을 받는지 모르게 처리하기 위해사용됨
  • 프록시 패턴을 이용하여 Cache기능으로 활용할 수 있다.
  • Spring에서 Proxy 패턴을 이용해 AOP를 구현했다.

 

사용하려는 클래스와 프록시의 코드와 프록시를 사용하는 방법은 다음과 같다.

public class SomeService implements SomeInterface{
    public void someMethod(){
        // Some Codes
    }
}
public class Proxy implements SomeInterface{
    private SomeInterface si;
    public void someMethod(){
        si = new SomeService();
        si.someMethod();
    }
}

public class Main {
    public static void main(String[] args) {
        SomeInterface si = new Proxy();
        si.someMethod();
    }
}
  •  실제 서비스에 대한 참조변수를 가진다. -> 프록시 클래스의 si
  •  실제 서비스(SomeService)와 같은 메서드를 갖고 사용된다.
  •  실제 서비스 전후에 별도 로직을 실행할 수 있다. (값 제어는 하지 않는다)

3) 데코레이터 패턴

4) 퍼사드 패턴

5) 브릿지 패턴

- 계속...

 

댓글