본문 바로가기

OOP, FP/디자인패턴

(20)
헤드퍼스트 디자인 패턴: 8. 퍼사드 패턴 지난 포스팅에선 호환되지 않는 인터페이스를 변환하여 클라이언트에게 제공하는 어댑터 패턴에 대해 알아보았다. 이번엔 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공하는 퍼사드 패턴에 대해 복습한다. 퍼사드 패턴어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다.퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있습니다. 퍼사드 패턴은 단순화된 인터페이스를 통해서 서브시스템을 더 쉽게 사용할수 있도록 하기 위한 용도로 사용된다. 어떤 서브시스템에 속한 일련의 복잡한 클래스들을 단순화하고 통합한 클래스를 만들어서 제공한다.다른 패턴과 달리 퍼사드 패턴은 상당히 단순하며 복잡한 추상화와같은 개념이 필요 없다. 퍼사드 패턴을 이용하면 클라이언트와 서..
헤드퍼스트 디자인 패턴: 6. 커맨드 패턴 지난 포스팅에선 어떤 클래스의 인스턴스 개수를 프로그램에서 하나로 제한하고 전역 접근을 제공하는 싱글턴 패턴에 대해 알아보았다. 이번엔 메소드 호출을 캡슐화 하는 커맨드 패턴에 대해 복습한다. 커맨드 패턴요구 사항을 객체로 캡슐화할 수 있으며 매개변수를 써서 여러 가지 다른 요구 사항을 집어넣을 수도 있다.커맨드 패턴을 이용하면 캡슐화된 메소드 호출을 큐에 저장하거나 로그로 기록할 수 있으며, 작업취소 기능도 지원 가능하다. 다른 패턴에 비해 다이어그램이 조금 복잡하다. (1) 인보커: 클라이언트로가 필요한 작업을 요청할 때 사용한다. 커맨드 객체를 구성요소로 갖고 있으며 세터를 지원해서 반드시 커맨드 객체를 설정해야한다. (2) 리시버: 실제 호출될 메소드를 갖고 있는 객체, 인보커를 거쳐 커맨드 객체..
헤드퍼스트 디자인 패턴: 7. 어댑터 패턴 지난 포스팅에선 메소드 호출을 캡슐화하는 커맨드 패턴에 대해 알아보았다. 이번엔 호환되지 않는 인터페이스를 변환하여 클라이언트에게 제공하는 어댑터 패턴에 대해 복습한다. 어댑터 패턴한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다.이를 이용하여 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. 아이폰과 안드로이드 폰의 충전기는 규격이 달라 서로 호환되지 않는다.안드로이드 폰 충전기에 변환젠더를 연결하면 아이폰을 충전할 수 있게 된다. 여기서 변환젠더와 같이 호환성 문제 때문에 사용할 수 없는 객체를중간에서 변환하여 사용가능하게 만들어주는 녀석이 어댑터라고 생각하면 될 것 같다. (1) 타겟: 클라이언트에게 제공하는 인터페이스 (2) 어댑터:..
헤드퍼스트 디자인 패턴: 5. 싱글턴 패턴 지난 포스팅에선 객체 생성을 추상 인터페이스를 통해 캡슐화하여 일련의 제품들을 공급할 수 있는 추상 팩토리 패턴에 대해 알아보았다. 이번엔 어떤 클래스의 인스턴스 개수를 프로그램에서 하나로 제한하는 싱글턴 패턴에 대해 복습한다. 싱글턴패턴해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴 고전적인 싱글턴패턴 구현법싱글턴 패턴의 고전적인 구현법은 간단하다.클래스의 생성자를 사용할 수 없게 private으로 선언한 뒤 메소드로 인스턴스에 접근할 수 있게 한다.인스턴스에 접근하는 메소드가 호출되었을 때, 프로그램 메모리에서 해당 인스턴스가 하나도 생성되지 않았을 경우에만한번 생성하고 이후에는 인스턴스를 생성하지 않게하면 된다. public class Sing..
헤드퍼스트 디자인 패턴: 4-2. 추상 팩토리 패턴 지난 포스팅에서는 객체 생성을 캡슐화하여 서브클래스에게 위임하는 팩토리 메소드 패턴에 대해 알아보았다.이번에는 객체 생성을 추상 인터페이스를 통해 캡슐화하여 일련의 제품들을 공급할 수 있는 추상 팩토리 패턴에 대해 복습한다. 그전에 의존성 뒤집기 원칙에 대해서 다시 한번 짚고가자. 의존성 뒤집기 원칙"추상화된 것에 의존하도록 만들어라. 구상 클래스에 의존하도록 만들지 않도록 한다." 구상 클래스가 아닌 인터페이스에 맞춰 프로그래밍하라는 세번째 원칙과 비슷하다.하지만 DIP(Dependency Inversion Principle)에서는 추상화를 더 많이 강조한다. 고수준 구성요소가 저수준 구성요소에 의존하면 안된다고 강조한다.항상 추상화된 요소에 의존하도록 해야한다. 여기서 ConcreateClient는 ..
헤드퍼스트 디자인 패턴: 4-1. 팩토리 메소드 패턴 지난 포스팅에선 객체를 감싸서 새로운 임무를 부여하는 데코레이터 패턴에 대해 알아보았다.이번에는 객체를 생성하는 과정을 분리하여 불필요한 의존성을 없애는 팩토리 패턴에 대해 복습한다. 구상 객체와 new 키워드 Duck duck = new MallardDuct();Duck이라는 인터페이스를 써서 코드를 유연하게 만드려고 했는데,대입하는 쪽을 보니 MallardDuck이라는 구상 클래스의 인스턴스를 생성해서 대입했다. 여기서 구상클래스가 여러개 있을 경우 어쩔 수 없이 아래와 같은 코드를 만든다.Duck duck; if(picnic) {duck = new MallardDuck() } else if(hunting) {duck = new DecoyDuck();} else if(inBathTub) {duck =..
헤드퍼스트 디자인 패턴: 3. 데코레이터 패턴 지난 포스팅에선 의존성을 줄이고 객체들에게 상태의 변화를 알릴 수 있는 옵저버 패턴에 대해 알아보았다.이번에는 실행중에 클래스를 꾸미거나 기능을 확장할 수 있는 데코레이터 패턴에 대해 복습한다. 데코레이터 패턴객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터 패턴은 서브클래스를 만드는 것을 통해서기능을 유연하게 확장할 수 있는 방법을 제공한다. 우선 데코레이터 패턴을 사용하면 원래 클래스의 코드는 전혀 바꾸지 않고도 객체에 새로운 임무를 부여할 수 있다.클래스 다이어그램을 살펴보면 그 원리를 알 수 있다. 감싸는 대상이 될 클래스를 Component라고 한다.우선 공통부분을 Component 라는 인터페이스로 정의하고 각각 필요한 구현을 한다.여기까진 일반적인 인터페이스 사용법과 다름이 없다. 이런 ..
헤드퍼스트 디자인 패턴: 2. 옵저버 패턴 지난 포스팅에서 알고리즘을 캡슐화하고 동적으로 알고리즘을 변경할 수 있는 스트래티지 패턴에 대해 복습했다.오늘은 상태의 변화를 알리면서 의존성을 줄이는데 초점을 두는 옵저버 패턴에 대해 복습한다. 옵저버 패턴어떤 객체의 상태가 바뀌거나 중요한 메소드가 호출 되었을 때 이와 관련된 객체들에게 소식을 전달할 수 있는 패턴이다. 일대일로 연락을 전할 뿐 아니라, 연락을 전달하는 입장에서는 일대다 관계,연락을 받는 입장에서는 다대일 관계, 즉 다대다 관계로 연락을 전달할 수 있다. 옵저버 패턴은 이러한 연락을 주고받는 관계에서 의존성을 줄이는데 목적을 둔다.디자인패턴의 4번째 원칙 "서로 상호작용을 하는 객체 사이에서는 가능한 느슨하게 결합하는 디자인을 사용한다"와 밀접한 관계를 가진 패턴이다. 옵저버 패턴의 ..