프로그래밍/DesignPattern 17

커맨드 패턴 I

** 호출 캡슐화 ** 한차원 높은 단계의 캡슐화 - 메소드 호출을 캡슐화한다. 메소드 호출을 캡슐화하면 계산 과정의 각 부분들을 결정화시킬 수 있기 때문에, 계산하는 코드를 호출한 객체에서는 어떤 식으로 일을 처리해야 하는지에 대해 전혀 신경 쓰지 않아도 된다. 그냥 결정화된 메소드를 호출해서 필요한 일만 잘 할 수 있으면 된다. 그 외에도 캡슐화된 메소드 호출을 로그 기록용으로 자장을 한다거나 취소 기능을 구현하기 위해 재사용하는 것과 같이 신기한 작업을 할 수도 있다. 커맨드 패턴과 유사한 형태의 실생활 패턴 고급 식당 운영 패턴 1. 고객이 웨이트리스한테 주문을 한다. 2. 주문서에 주문한 메뉴가 적힌다. 3. 웨이트리스는 주문서를 받아서 카운터에 갖다 주고는 "주문 받아요!" 라고 얘기 한다. ..

원칙을 지키는 데 도움이 될만한 가이드라인...

다음과 같은 가이드라인을 따르면 의존성 뒤집기 원칙에 위배되는 객체지향 디자인을 피하는 데 도움이 된다. 1. 어떤 변수에도 구상 클래스에 대한 레퍼런스를 저장하지 말자. - new 연산자를 사용하면 구상 클래스에 대한 레퍼런스를 사용하게 되는 것이다. 팩토리를 써서 구상 클래스에 대한 레퍼런스를 변수에 저장하는 일을 미리 방지하자. 2. 구상 클래스에서 유도된 클래스를 만들지 말자 - 구상 클래스에서 유도된 클래스를 만들면 특정 구상 클래스에 의존하게 된다. 인터페이스나 추상 클래스처럼 추상화 된 것으로부터 클래스를 만들어야 한다. 3. 베이스 클래스에 이미 구현되어 있던 메소드를 오버라이드 하지 말자 - 이미 구현되어 있는 메소드를 오버라이드한다는 것은 애초부터 베이스 클래스가 제대로 추상화 된 것이..

팩토리 - 팩토리 메소드 패턴

팩토리 패턴(사실 간단한 팩토리는 디자인 패턴이라고 할수 없다) 모든 팩토리 패턴에서는 객체 생성을 캡슐화한다. 장점 : 객체를 인스턴스화하는 작업을 한 클래스에 캡슐화시켜 놓으면 구현을 변경해야 하는 경우에 여기저기 다 들어가서 고칠 필요 없이 팩토리 클래스 하나만 고치면 된다 팩토리 메소드 패턴의 정의 : 팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스(추상메소드)를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이다. 객체를 인스턴스화하는 일을 하는 메소드(팩토리 클래스로 캡슐화 된 메소드)를 생성된 객체를 사용할 클래스에 추상메소드로 만든다. 물론 해당 클래스는 추상클래..

데코레이터 패턴

클래스의 소스변경없이 추가기능을 동적으로 추가시키는 패턴. 데코레이터 패턴을 적용한 사례는 java.io 패키지에 많이 있다. Reader reader = new BufferedReader(new InputStreamReader(System.in)); ==> 풀어보면... Reader reader = new InputStreamReader(System.in); reader = new BufferedReader(reader); 정의 - 객체에 추가 요소를 동적으로 더할 수 있습니다. 데코레이터를 사용하면 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공합니다.

옵저버 패턴

출판사+구독자=옵저버 패턴 1. 신문사가 사업을 시작하고 신문을 찍어내기 시작합니다. 2. 독자가 특정 신문사/잡지사에 구독 신청을 하면 매번 새로운 신문/잡지가 나올 때마다 배달을 받을 수 있습니다. 계속 구독자로 남아있는 이상 계속해서 신문/잡지를 받을 수 있습니다. 3. 신문을 더 이상 보고 싶지 않으면 구독 해지 신청을 합니다. 그러면 더 이상 신문이 오지 않습니다. 4. 신문사가 계속 영업을 하는 이상 여러 개인 독자, 호텔, 항공사 및 기타 회사 등에서 꾸준히 구독 및 해지를 하게 됩니다. 옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many)의존성을 정의합니다...

디자인 원칙

* 1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리 시킨다. "바뀌는 부분은 따로 뽑아서 캡슐화시킨다. 그렇게 하면 나중에 바뀌지 않는 부분에는 영향을 미치지 않은 채로 그 부분만 고치거나 확장할 수 있다" - 모든 패턴은 '시스템의 일부분을 다른 부분과 독립적으로 변화시킬 수 있는 방법' 을 제공하기 위함 2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍 한다. 3. 상속보다는 구성을 활용한다. 4. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다. - 느슨하게 결합하는 디자인을 사용하면 변경 사항이 생겨도 무난히 처리할 수 있는 유연한 객체지향 시스템을 구축할 수 있다. 객체 사이의 상호의존성을 최소화할 수 있기 때문이다. * 5...

스트래티지 패턴

변할수 있는 행동(메소드) - 알고리즘군 - 을 캡슐화하고, 캡슐화된 인터페이스를 구현한 각각의 행동클래스를 만든다. 이로인해 , 변할수있는 행동이 따로 분리 되고, 캡슐화하여 구현했기 때문에 , 매우 유연하고 느슨한 결합도(loose coupling)를 갖도록 설계가 가능하다. 슈퍼클래스가 캡슐화된 인터페이스를 포함하고, setter메소드(인터페이스 i)를 만들어 슈퍼클래스의 자손클래스에서 해당 인터페이스를 구현한 클래스라면 언제든지,무엇이든지 행동을 변경할 수 있다. 그리고 만들어놓은 행동클래스를 다른객체에서도 재사용할수있다. 또 기존의 행동클래스를 수정하거나 슈퍼클래스를 수정하지않아도 새로운 행동을 추가 할수있다.