목록JAVA객체지향디자인패턴 (13)
JUINTINATION
컴퍼지트 패턴이란? 부분-전체의 관계를 갖는 객체들 사이의 관계를 정의하여 클라이언트가 전체와 부분을 구분하지 않고 동일한 인터페이스를 사용할 수 있게 만드는 패턴이다. 다음과 같이 컴퓨터를 모델링했다고 하자. 컴퓨터는 다음과 같이 키보드(Keyboard 클래스), 본체(Body 클래스), 그리고 모니터(Monitor) 클래스로 이루어져있다. class Keyboard { private int price; private int power; public Keyboard(int price, int power) { this.price = price; this.power = power; } public int getPrice() { return price; } public int getPower() { retu..
추상 팩토리 패턴이란? 관련성 있는 여러 종류의 객체를 일관된 방식으로 생성하는 경우에 객체를 생성하는 코드를 캡슐화하여 구체적인 클래스에 의존하지 않고 서로 연관되거나 의존적인 객체들의 조합을 만드는 패턴이다. 다음과 같이 엘레베이터 부품 업체에 대한 설계가 있다고 하자. Motor 클래스의 move 메서드의 구조는 다음과 같다. public void move(Direction direction) { // 1. 이미 이동 중이면 무시한다. // 2. 만약 문이 열려 있으면 문을 닫는다. // 3. 모터를 구동해서 이동시킨다. // 4. 모터의 상태를 이동 중으로 설정한다. } 3번 부분을 제외하면 Hyundai 모터, LG 모터 둘 다 코드가 동일하기 때문에 템플릿 메서드 패턴을 적용할 수 있다. Do..
팩토 메서드 패턴이란? 상황에 따라 객체를 다르게 생성해야 할 때 1개의 클래스가 아닌 코드를 각각의 하위 클래스에서 재정의하게 하여 객체의 생성 코드를 별도의 클래스/메소드로 분리하는 패턴이다. 다음과 같이 엘레베이터 제어 시스템에서 다양한 엘레베이터 스케줄링을 지원한다고 하자. import java.util.ArrayList; import java.util.List; enum Direction { UP, DOWN; } class ElevatorManager { private List controllers; private ThroughputScheduler scheduler; public ElevatorManager(int controllerCount) { controllers = new ArrayLi..
탬플릿 메서드 패턴이란? 전체적으로 동일하면서 부분적으로 상이한 문장을 가지는 메소드의 코드 중복을 최소화하기 위해 상이한 부분은 하위 클래스에서 구현할 수 있도록 해주는 디자인패턴이다. 다음과 같이 엘레베이터 제어 시스템에서의 모터 관련 설계가 있다고 하자. enum DoorStatus { CLOSED, OPENED } enum MotorStatus { MOVING, STOPPED } enum Direction { UP, DOWN } class Door { private DoorStatus doorStatus; public Door() { doorStatus = DoorStatus.CLOSED; } public DoorStatus getDoorStatus() { return doorStatus; } p..
데커레이터 패턴이란? 기본 기능에 추가할 수 있는 기능의 종류가 많은 경우 기본 기능에 추가될 수 있는 많은 수의 부가 기능에 대해서 다양한 조합을 동적으로 구현할 수 있는 패턴이다. 다음과 같이 도로를 여러 가지 표시하는 프로그램이 있다고 하자. public class Client { public static void main(String[] args) { RoadDisplay roadDisplay = new RoadDisplay(); roadDisplay.draw(); RoadDisplayWithLane roadDisplayWithLane = new RoadDisplayWithLane(); roadDisplayWithLane.draw(); } } class RoadDisplay { public voi..
옵서버 패턴이란? 통보 대상 객체의 관리를 Subject 클래스와 Observer 인터페이스로 일반화하여 데이터의 변경이 발생하였을 때 상대 클래스 및 객체에 의존하지 않으면서 데이터 변경을 통보하고자 할 때 데이터 변경을 통보하는 클래스(ConcreteSubject)의 통보 대상 클래스/객체(ConcreteObserver)에 대한 의존성을 제거하여 통보 대상 클래스나 대상 객체의 변경에도 ConcreteSubject 클래스를 수정 없이 사용하는 패턴이다. 다음과 같이 여러 가지 방식으로 성적을 출력하는 프로그램이 있다고 하자. import java.util.ArrayList; import java.util.List; public class Client { public static void main(St..