프록시 패턴 : 프록시패턴에 실행하고자 하는 실제 서비스의 메서드와 동일한 이름을 가지는 메서드를 통해 실행을 대신하는 것이다. 로직 제어가 필요할 떄 사용하게 된다.
1) 인터페이스를 사용해 실제 서비스 객체와 대리자 객체가 동일한 메서드명을 가지게 한다.
2) 클라이언트는 인터페이스에 의존한다.
3) 따라서 클라이언트는 실제 서비스 객체 자리에 프록시(대리자)객체를 투입한다.
4) 프록시의 메서드는 실제 서비스 객체의 동일한 메서드를 실행한다.
코드의 복잡도가 증가하고, 로직을 이해하기 어려워질 수 있다.
빈번한 객체 생성에는 부적절하다. 프록시 패턴은 객체 생성에 더 많은 자원이 필요하기 때문이다.
접근을 제어하고 싶거나 추가 로직, 로직 제어에 사용한다.
인터페이스, 프록시는 실제 서비스 객체를 가진다.
package OOP06.proxyPattern;
public interface Reder {
String readBook();
}
package OOP06.proxyPattern;
public class BookReader implements Reder{
public String readBook() {
return "📖 책 읽기";
}
}
package OOP06.proxyPattern;
public class Proxy implements Reder{
BookReader bookReader = new BookReader();
public String readBook() {
System.out.println("용량 체크!");
return bookReader.readBook();
}
}
package OOP06.proxyPattern;
public class Driver {
public static void main(String[] args) {
Reder reder = new Proxy();
System.out.println(reder.readBook());
}
}
용량 체크!
📖 책 읽기
데코레이터 패턴 : 데코레이터 객체는 실제 서비스 객체와 동일한 메서드명을 가지고, 클라이언트의 호출에 실제 서비스 객체의 반환값 + 추가 로직을 한 결과를 반환한다.
데코레이터 패턴은 프록시 패턴과 유사하지만, 반환값을 변경한다는 차이점이 있다.
기존의 코드를 수정하지 않고도 객체의 책임과 역할을 확장할 수 있어서 유연성이 높다.
package OOP06.decoratorPattern;
public interface Reder {
String readBook();
}
package OOP06.decoratorPattern;
public class BookReader implements Reder {
public String readBook() {
return "📖 책 읽기";
}
}
package OOP06.decoratorPattern;
public class Decoreator implements Reder {
BookReader bookReader = new BookReader();
public String readBook() {
System.out.println("용량 체크!");
return "🩷북 리더기🩷"+ bookReader.readBook();
}
}
package OOP06.decoratorPattern;
public class Driver {
public static void main(String[] args) {
Reder reder = new Decoreator();
System.out.println(reder.readBook());
}
}
용량 체크!
🩷북 리더기🩷📖 책 읽기
어댑터 패턴은 이미, 기존에 작성된 코드나 클래스를 쉽게 재사용할 수 있게한다.
따라서 실제 서비스 객체는 기존에 만들어져있다.
실제 서비스 객체와 패턴 구현 객체의 메서드명은 다르다.
기존 코드를 확장하거나, 로직을 변경하기 위해 사용한다.
따라서 기존 코드의 메서드명과 동일하다.
객체 지향 디자인 패턴으로 객체지향을 따른다.