본문 바로가기

JAVA/Design Patterns

(23)
전략패턴 전략패턴 예)상황에 따라 다른 가격 할인 정책- 첫손님 할인- 저녁 시간대 할인 계산하는 모듈에 가격 할인 정책public class Calculator {public int calculate(boolean firstGuest, List items) {int sum = 0;for(Item item : items) {if(firstGuest)sum += (int)(item.getPrice() * 0.9 ) ;//첫손님else if (! item.isFresh())sum += (int)(item.getPrice() * 0.8 ) ;// 덜신선한 상품elsesum += item.getPrice();}return sum;}} 문제점)1. 서로 다른 계산 정책들이 한 코드에 섞여 있다.2. 추가될수록 코드 분석이..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제 요약 요약작성하는 코드의 80%정도를 구체 클래스가 아닌 인터페이스를 이용해야 하며, 이는 요구사항이 변경되었을 때 프로그램을 쉽게 바꿀 수 있도록 해주는 유연성을 제공해준다.우리는 객체를 인스턴스화하는 실제 클래스 대신 클래스가 구현하고 있는 인터페이스를 통해 객체를 생성하도록 돕는 여러 패턴을 보았다. Singleton - 제한된 수의 객체를 생성한다.Abstract Factory - 관련된 객체 군(family)중 하나를 생성하도록 해주는 '팩토리'. 이때 생성되는 객체의 구체 타입은 인터페이스를 통해 가려진다. 구체 타입이 아닌 인터페이스를 통해 프로그래밍하기 때문이다.Template Method - 기반 클래스에서 일반 알고리즘을 정의하고, 파생 클래스에서 알고리즘을 사용하는 추상 메소드를 오버라이딩..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제3 Template Method와 Factory Method 패턴updateBuffer()는 템플릿 메소드(Template Method) 패턴의 예이다.Template Method에서는 기반 클래스 코드가 오버라이딩 가능한 메소드를 호출하고, 메소드의 구현은 기반클래스를 구현한 상속 클래스에서 제공한다.기반 클래스의 메소드는 대부분의 경우 abstact이지만, 때로는 디폴드 연산을 구현하고 있을 수도 있다. Template Method 패턴에서는 기반 클래스가 알고리즘을 정의하고 이 알고리즘에서 오버라이딩 가능한 메소들을 호출한다. 그리고 기반 클래스를 상속한 파생클래스에서 각 메소드를 재저의하여 알고리즘의 행위를 커스터마이징 한다. Template Method 패턴은 가능한 절제해 사용해야한다.클래스 자체..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제2 다중상속다중(구현)상속을 지원하는 언어는 클래스 정의에서 여러 개의 extends 관계를 허용한다.만약 구현 상속이 나쁘다면 분명 다중 구현 상속은 더 나쁘다.하지만 다중 상속의 '개념'이 유용할 때가 있다.예를 들어 메뉴바를 가진 프레임 윈도인 '메뉴 사이트'를 소개하는데 애플리케이션의 메인 윈도는 프레임윈도(JFrame)이면서 또한 MenuSite이다.메뉴 사이튼 두기반 클래스의 모든 속성을 지니고 있으며, 이런 상황에서의 다중 상속은 합당하다. 다중 상속'개념'이 유용할 경우가 있다. JFrame을 확장하고 MenuSite 인터페이스를 구현하며, 모든 MenuSite 연산을 기본 구현 객체에 위임한다.개념적으로 이는 다중 상속과 같은 기능을 한다.이런 위임 기반의 해결책은 경험있는 개발자들은 흔히 ..
인터페이스로 프로그래밍하기 #깨지기 쉬운 기반 클래스 문제1 깨지기 쉬운 기반 클래스 문제이제 결합도의 개념을 상속에 적용해 보자extends를 사용하는 구현 상속 관계에서는 파생클래스(자식 클래스)가 기반 클래스(부모 클래스)에 강하게 결합되며, 이런 강한 결합은 바람직하지 않다.디자이너들은 구현 상속으로 인한 강결합으로 인한 부작용을 설명하기 위해 '깨지지 쉬운 기반 클래스 문제'란 별칭을 붙였다. 이때 겉으로는 안전해 보이는 방식으로 기반 클래스를 수정했지만 파생 클래스가 잘못 작동하게 되는 경우가 왕왕 있기 때문에 '깨지지 쉬운'이라는 수식어가 붙게 되었다.기반 클래스는 기반 클래스만 따로 떨어뜨려 놓고 안전하게 수정할 수 없으며, 모든 파생 클래스를 함께 살펴보고 테스트해 보야야 한다.당연히 기반 클래스를 사용하는 객체뿐 아니라 파생 클래스를 사용하는 객..
인터페이스로 프로그래밍하기 #인터페이스 vs 클래스 인터페이스 관점에서 프로그래밍하는 것은 OO(object-oriented) 시스템의 기본 개념이며 GoF의 디자인 패턴은 이의 구체적인 예가 된다.보통 인터페이스를 사용하지 않고 extends 관계를 남용하고 있다. extends 키워드디자인 패턴은 크게 보면 구현상속(extends)을 인터페이스 상속(implements)으로 바꾸는 방법을 설명하고 있다. extends는 적절히 사용하면 값진 도구이지만 많은 개발자들이 남용하고 있다.extends와 같은 언어 기능은 분명 OO시스템 구현을 용이하게 해주지만,단순히 상속을 사용하는 것이 시스템을 객체 지향적으로 만들어주지는 않는다. OO언어를 사용하여 프로그래밍을 했다고 OO시스템이 되는 것이 아니다. 언어가 제공하는 기능을 목적에 맞게 사용해야 된다. ..
디자인 패턴 - 스트래티지 디자인 패턴(Design Patterns) 1.객체지향의 기초 추상화, 캡슐화, 다형성, 상속 2.객체지향의 원칙 바뀌는 부분은 캡슐화한다. 상속보다는 구성을 활용한다. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다. 3.객체지향 패턴 스트래티지 패턴 - 알고리즘군을 정의하고 각각을 캡슐화하여 바꿔 쓸 수 있게 만듭니다. 스트래티지 패턴을 이용하면 알고리즘을 활용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있습니다.