본문 바로가기

IT Book Summary/디자인패턴

(7)
템플릿 메소드 패턴 The Template Method Pattern: Encapsulating Algorithms 커피 및 홍차 클래스 만들기 커피 만드는 것과 홍차 만드는것의 공통부분을 추상화 하자. 동일한 알고리즘 추상화. 물을 끓인다. 뜨거운 물을 이용해 커피 또는 홍차를 우려냄. 만들어진 음료를 컵에 따름. 각 음료에 맞는 첨가물을 추가한다. prepareRecipe() 추상화하기 1. 비슷한 행위를 같은이름으로 통일해서 새로운 메소드를 만듬. // Coffee void prepareRecipe() { boilWater(); brewCoffeeGrinds(); purInCup(); addSugarAndMilk(); } // Tea void prepareRecipe() { boilWater(); steepTeaBag(); purInCup(); addLemon(); } // 메소드 통일 void prepareRe..
어댑터 패턴과 퍼사드 패턴 The Adapter and Facade Patterns: Being Adaptive 어댑터 패턴 Adapter Pattern 일반적 어댑터의 역할 : 소켓의 인터페이스를 플러그에서 필요로하는 인터페이스로 바꿔줌. 객체지향 어댑터의 역할 : 어떤 인터페이스를 클라이언트에서 요구하는 형태의 인터페이스에 적응시켜주는 역할. 객체지향 어댑터 어떤 시스템에 새로 제공한 클래스 라이브러리를 사용해야하지만 인터페이스가 다를경우, 어댑터는 클라이언트로부터 요청을 받아 새로운 업체에서 제공한 클래스에서 받아들일수 있는 행태의 요청으로 변환시켜주는 중개인 역할을 한다. 클라이언트에서 어댑터를 사용하는 방법 1. 클라이언트에서 타겟 인터페이스를 사용해 메소드를 호출함으로써 어댑터에 요청을 한다. 2. 어댑터에서는 어댑티 Adaptee 인터페이스를 사용해 그 요청을 어댑티에 대한 (하나 이상의) 메소드 호출..
Command Pattern 커맨드 패턴, 호출 캡슐화 한 차원 높은 단계의 캡슐화 메소드 호출을 캡슐화하면 계산과정의 각 부분들을 결정화 시킬 수 있다. 홈 오토메이션 리모컨 구성 일곱가지 프로그래밍 가능한 슬롯 슬롯마다 on, off 버튼 마지막 누른 버튼에 대한 명령을 취소하기위한 undo 버튼 리모컨에서 제어해야하는 객체의 인터페이스등 커멘드 패턴을 스면 작업을 요청한 쪽과 처리하는 쪽을 분리시킬 수 있다. 커맨드 객체는 특정 객체에 대한 작업요청을 캡슐화시킴. 커맨드 패턴 클라이언트 는 커맨드 객체(리시버에 전달 할 일련의 행동으로 구성)를 생성. creaatCommandObject() 커맨드 객체에는 행동과 리시버 Reciever에 대한 정보가 들어 있음. 커맨드 객체에서 제공하는 메소드는 execute() 하나로 행동을 캡슐화. 리시버의 특정 행..
Singleton Pattern 싱글턴 패턴 인스턴스가 하나뿐인 특별한 객체를 만들 수 있게 해 주는 패턴. 특정 클래스에 대해서 객체 인스턴스가 하나만 만들어질 수 있도록 한다. 객체 중에 하나만 있어야 하는것이 있다. 예를들면 스레드 풀, 캐시, 대화상자, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체, 디바이스를 위한 디바이스 드라이버 등. 인스턴스가 두개 이상 만들어지면 일관성이 없어지거나 자원을 불필요하게 잡아먹을수 있다. 어떻게 하면 한 클래스의 인스턴스가 두개 이상 만들어지지 않도록 할 수 있을까? 고전적인 싱글턴 패턴 구현법 public class Singleton { // Singletno 클래스의 인스턴스를 저장하기 위한 정적 변수. private static Singleton uniqueInstance; // 생성자를 pr..
데코레이터 패턴 객체 꾸미기 상속을 남용하는 전형적인 예를 살펴보고 객체 작성이라는 형식으로 실행중에 클래스를 꾸미는 (데코레이션) 방법 데코레이터 패턴을 알면 원래 클래스의 코드는 바꾸지 않고도 다른사람이 만든 객체에 새로운 임무를 부여할 수 있다. 스타버즈 커피샵. 다양한 음료들을 모두 포괄하는 주문 시스템. Beverage 클래스는 추상클래스이며 각 서브클래스에서 description 인스턴스 변수와 cost() 를 구현한다. 그러나 다양한 옵션이 추가될경우 가격이 변동되기 때문에 너무 많은 클래스를 만들어야 한다. 그래서 음료에 추가되는 여러 옵션 인스턴트 변수를 추가하자. 추가 요소에 해당하는 Boolean 변수 추가. cost() 를 구현해 기본음료값에 추가비용을 합친 총 가격을 리턴한다. 하지만 추가요소 가..
Observer Pattern 옵저버 패턴 중요한 일이 일어났을때 객체들에게 소식을 알려줄 수 있는 패턴 객체 쪽에서 계속해서 정보를 받을지 여부를 실행중에 결정가능. 일대다 관계와 느슨한 결합 JDK에서 가장 많이 쓰이는 패턴 가운데 하나 Weather-O-Rama 사의 기상 모니터링 애플리케이션 예제 - WeatherData 객체를 사용해 현재조건, 기상통계, 기상예측 세 항목을 디스플레이에 갱신해 보여주는 애플리케이션 기상정보를 수집하는 기상 스테이션과 WeatherData 객체, 기상조건을 보여주는 디스플레이 로 이루어진다. 확인할 수 있는 규격 WeatherData 클래스에는 온도, 습도, 기압 세가지 측정값을 알아내는 Getter 메소드가 있다. 새 기상데이터가 나올때마다 measurementsChanged() 메소드 호출 현재조건, ..
Strategy pattern 스트래티지 패턴 스트래티지 패턴 - 알고리즘군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있게 만든다 - 스트래티지를 활용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다. 표준적인 객체지향 기법을 사용하여 Duck 수퍼클래스를 만든 후 확장해 여러종류의 오리를 만드는 경우 ->Duck에 메소드 하나가 추가되면 Duck을 상속받은 모든 클래스에 같은 기능을 구현해 주어야 한다. 인터페이스를 활용하자. 서브클래스에서 Flyable, Quaackable 을 구현하도록 할 수 있다. 디자인 원칙 - 애플리케이션에서 달라지는 부분을 찾아내고, 달라지는 부분으로부터 분리 시킨다. - 잘라지는 부분을 찾아서 나머지 코드에 영향을 주지 않도록 캡슐화 한다. - 시스템의 유연성 향상. 바뀌는 부분과 그렇..