분류 전체보기
-
행위패턴 > 템플릿 메서드 *기타/디자인패턴 2021. 2. 12. 15:42
템플릿은 틀을 의미한다. 템플릿 메서드는 알고리즘의 틀을 만들기 위한 것이다. 템플릿 메서드 패턴에서는 알고리즘의 골격을 정의한다. 템플릿 메서드는 일련의 단계들로 알고리즘을 정의한 메서드를 의미한다. 여러 단계 중 일부는 서브 클래스에서 구현할 수 있다. 템플릿 메서드를 이용하면 알고리즘 구조는 유지하면서 서브클래스에서 특정 단계를 재정의할 수 있다. 커피와 차를 만드는 과정이 각각 아래와 같다. 커피 => 1.물을 끓인다. 2. 커피를 우린다. 3. 커피를 컵에 4. 설탕과 우유 추가 차 => 1.물을 끓인다. 2. 차를 우린다. 3. 차를 컵에 4. 레몬 추가 이 때 일반화를 통해 공통으로 사용 가능한 부분을 추상화한 클래스를 만든다. "1. 끓인다.", "3. 컵에"와 같은 완전히 동일한 행동이 ..
-
행위패턴 > 상태(State) *기타/디자인패턴 2021. 2. 12. 15:41
동일한 동작을 객체 상태에 따라 다르게 처리해야 할 때 사용. 일련의 규칙에 따라 객체의 상태(State)를 변화시켜, 객체가 할 수 있는 행위를 바꾸는 패턴이다. 이렇게 하나의 객체에 여러 가지 상태(예, 정지, 상승, 하강)가 존재할 때 패턴을 사용하지 않고 프로그래밍을 하면 if 문 또는 switch 문을 사용하여 처리한다. 그런데 신규 상태(예, 문 열림, 문 닫힘)가 발생하면 프로그램을 다시 수정해야 한다. 또는 상속을 통해 만든 클래스에 새로운 기능을 추가할 때 일부 하위 클래스에서는 신규 기능이 필요하지만, 일부 클래스와는 무관할 때는? 뽑기 기계를 예시로, 동전없음, 동전있음, 알맹이 매진, 알맹이 판매 라는 네개의 상태를 가지는 뽑기 기계가 있다고 하자. public class Gambl..
-
행위패턴 > 옵저버 *기타/디자인패턴 2021. 2. 12. 15:39
객체의 상태변화에 따라 다른 객체의 상태도 연동되도록 일대다 객체 의존 관계를 구성 데이터 변경이 발생했을 경우 상대 클래스나 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 유용 Subject 와 Observer 는 서로를 변수로 가지고 있는다. Observer 는 생성자에서 받은 subject 를 registerObserver(this)로 등록해두고, Subject 에서는 자신에게 변화가 있을 때 Observer notify 를 호출한다. push방식, poll 방식으로 구현할 수 있다. Product 에 상태에 변화가 생기면 Observer 에서 이를 감지하고 ProductDisplay 에게 알려준다. public class ObTest { public static void main(Str..
-
행위패턴 > 이터레이터 *기타/디자인패턴 2021. 2. 11. 15:19
객체를 컬렉션에 저장할 때는 배열, 스택, 해시테이블 등 장단점을 따져 적합한 컬렉션을 선택해 이용한다. 클라이언트에서 모든 객체들에 일일이 접근하는 작업을 하고자할 때, 어떤 식으로 저장했는지 노출하지 않으면서 접근할 수 있도록 하는 방법과 객체들로 구성된 슈퍼 컬렉션에 대해 알아본다. A 식당과 B 식당이 합병하기로 했는데 A 식당은 메뉴를 ArrayList 에 B식당은 배열에 저장한다. Waitress 는 메뉴를 출력하려면 배열과 리스트 각각의 순환문을 작성해야 한다. Waitress 가 구상클래스 MenuItem[] 과 ArrayList 에 직접 연결되어있다. public class Waitress { PancakeHouseMenu pancake; DinerMenu diner; public Wai..
-
행위패턴 > 커맨드 *기타/디자인패턴 2021. 2. 11. 10:14
Invoker 와 Command 의 생명주기 같음 ConcreateCommand 는 Command 의 일반화 Client 는 ConcreteCommand 를 의존 객체의 행위( 메서드)를 클래스로 만들어 캡슐화 하는 패턴 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하기 위해 객체(B)를 의존하는 것을 방지 또한 기능이 수정되거나 변경이 일어날 때 A 클래스 코드를 수정없이 기능에 대한 클래스를 정의하면 되므로 시스템이 확장성이 있으면서 유연해진다. Client 클래스 RemoteLoader 는 concreteCommand 를 생성하고 Receiver 를 생성한다. Receiver Light, Garage 는 요구 사항을 수행하기 위해 어떤 일을 해야 하는지 알고 있는 객체이다. ConcreteCo..
-
구조패턴 > 퍼싸드 *기타/디자인패턴 2021. 2. 11. 10:12
facade : 1(건물의) 정면[앞면] 2(실제와는 다른) 표면, 허울 퍼사드 패턴은 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공하는 것을 말한다. 퍼사드에서 고수준 인터페이스를 제공하기 때문에 서브시스템을 더 쉽게 사용할 수 있다. 예를 들어 홈씨어터에 조명, 스크린, 프로젝트,dvd 기계들을 끄고 켜고 등 조작하는 행위들을 하는 여러 서브시스템을 가지고 있을 때, 그러한 여러 객체를 한 번에 호출하고 조작해주는 facade 객체를 생성하는 것이다. * 최소 지식 원칙 객체 사이의 상호작용은 될 수 있으면 아주 가까운 "친구" 사이에서만 허용하는 것이 좋다. 어떤 객체든 그 객체와 상호작용하는 클래스의 개수, 상호작용을 어떤식으로 하는 지에 주의를 기울여야 한다는 의미이다. 여..
-
구조패턴 > 데코레이터 *기타/디자인패턴 2021. 2. 11. 10:10
기본 기능 + 여러가지 추가 기능 상속은 강력하지만 상속을 사용한다고 무조건 유연하고, 관리하기 쉬운 디자인이 만들어 지는 것은 아니다. Coffee 라는 추상 클래스의 상속을 통해 다양한 옵션의 커피를 만들려면 엄청나게 많은 수의 클래스를 생성, 관리해야한다. 이런 서브 클래스를 만드는 방식의 상속은 행동이 컴파일시에 완전히 결정되고 모든 서브 클래스가 똑같은 행동을 상속받아 어떤 클래스에서는 불필요한 행동을 가질 수 있다. 하지만 구성을 통해 객체의 행동을 확장하면 실행 중에 동적으로 행동을 설정할 수 있다. 이 기술을 통해 슈퍼 클래스에서는 생각치 못했던 새로운 임무를 기존 코드의 수정없이 개별 객체에 더할 수도 있다. 이는 객체지향 OCP 원칙이기도 하다. 데코레이터는 객체를 "장식" 하는 패턴이..
-
구조패턴 > 컴포지트 *기타/디자인패턴 2021. 2. 11. 10:09
객체들을 트리 구조로 구성해 부분과 전체를 나타내는 계층 구조로 만들 수 있다. 컴포지트 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체들로 구성된 복합객체(composite) 를 똑같은 방법으로 다룰 수 있다. 부분-전체 계층구조란, 부분들이 모여있지만, 모든 것을 하나로 묶어서 전체로 다룰 수 있는 구조를 말한다. 컴포지트 패턴을 이용하면 객체의 구성과 개별 객체를 노드로 가지는 트리 형태로 객체를 구축할 수 있다. 이런 복합 구조를 사용하면 복합 객체와 개별 객체에 대해 똑같은 작업을 적용할 수 있다. 즉, 대부분의 경우에 복합 객체와 개별 객체를 구분할 필요가 없어진다. 팬케이크하우스, 객체식당, 카페 식당이 병합되고 객체식당의 메뉴 내에 디저트 메뉴도 새로 만들어 끼워넣는다고 해보자. 객체..