요약 프록시 패턴 프록시 패턴의 정의 원격 프록시와 가상 프록시 비교하기 앨범 커버 뷰어 만들기 앨범 커버 가상 프록시 설계하기 메모 프록시 패턴의 정의 📍 프록시 패턴(Proxy Pattern) : 특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)을 제공함. 프록시 패턴을 사용하면 원격 객체라든가 생성하기 힘든 객체, 보안이 중요한 객체와 같은 다른 객체로의 접근을 제어하는 대리인 객체를 만들 수 있음. 프록시에서 원격 객체로의 접근을 제어하는 몇 가지 방법이 있음. 원격 프록시를 써서 원격 객체로의 접근을 제어할 수 있음. 가상 프록시(virtual proxy)를 써서 생성하기 힘든 자원으로의 접근을 제어할 수 있음. 보호 프록시(protection proxy)를 써서 접근 권한이 필..
요약 프록시 패턴 서버에 필요한 코드 살펴보기 작동 방식 클라이언트 코드 살펴보기 GumballMachine 클래스를 원격 서비스로 바꾸기 RMI 레지스트리 등록하기 GumballMonitor 클라이언트 코드 고치기 메모 서버에 필요한 코드 살펴보기 [원격 인터페이스] import java.rmi.*; public interface MyRemote extends Remote { public String sayHello() throws RemoteExceptionl; } [원격 서비스를 구현한 클래스] import java.rmi.*; import java.rmi.server.*; public class MyRemoteImpl extends UnicastRemoteObject implements MyRem..
요약 프록시 패턴 원격 프록시의 역할 모니터링 코드에 원격 프록시 추가하기 원격 메소드의 기초 자바 RMI의 개요 원격 서비스 만들기 1단계: 원격 인터페이스 만들기 2단계: 서비스 구현 클래스 만들기 3단계: rmiregistry 실행하기 4단계: 원격 서비스 실행하기 메모 원격 프록시의 역할 원격 프록시는 원격 객체의 로컬 대변자 역할을 함. 원격 객체란 다른 자바 가상 머신의 힙에서 살고 있는 객체를 뜻함. 다른 주소 공간에서 돌아가고 있는 객체 로컬 대변자란 로컬 대변자의 어떤 메소드를 호출하면, 다른 원격 객체에게 그 메소드 호출을 전달해 주는 객체를 뜻함. 클라이언트 객체는 원격 객체의 메소드 호출을 하는 것처럼 행동함. 하지만 실제로 로컬 힙에 들어있는 프록시 객체의 메소드를 호출하고 있음...
요약 프록시 패턴 모니터링 코드 만들기 메모 모니터링 코드 만들기 public class GumballMachine { // 기타 인스턴스 변수 String location; public GumballMachine(String location, int count) { // 기타 생성자 코드 this.location = location; } public String getLocation() { return location; } } 위치는 그냥 String 으로 저장함. 위치는 생성자로 전달되어 인스턴스 변수에 저장됨. 위치를 알려주는 용도로 호출할 수 있는 게터 메소드를 추가함. public class GumballMonitor { GumballMachine machine; public GumballMon..
요약 상태 패턴 상태 패턴의 정의 상태 패턴 vs 전략 패턴 보너스 알맹이 당첨 기능 추가하기 디자인 도구상자 안에 들어가야 할 도구들 메모 상태 패턴의 정의 📍 상태 패턴(State Pattern) : 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있음. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있음. State 인터페이스는 모든 구상 상태 클래스의 공통 인터페이스를 정의 함. 모든 상태 클래스에서 같은 인터페이스를 구현하므로, 바꿔가면서 쓸 수 있음 Context 클래스에서는 여러 가지 내부 상태가 들어있을 수 있음. 앞에서 살펴본 GumballMachine이 Context에 해당함. ConcreteState 는 Context로 부터 전달된 요청을 자기 나름의 방식으로 구현해..
요약 상태 패턴 새로운 디자인 구상하기 State 인터페이스 및 클래스 정의하기 State 클래스 구현하기 뽑기 기계 전체 코드 살펴보기 다른 상태 클래스 구현하기 뽑기 기계 구조 다시 살펴보기 메모 새로운 디자인 구상하기 기존 코드를 그대로 활용하는 대신, 상태 객체들을 별도의 코드에 넣고, 어떤 행동이 일어나면 현재 상태 객체에서 필요한 작업을 처리하게 함. 우선 뽑기 기계와 관련된 모든 행동에 관한 메소드가 들어있는 State 인터페이스를 정의한다. 기계의 모든 상태를 대상으로 상태 클래스를 구현한다. 조건문 코드를 전부 없애고 상태 클래스에 모든 작업을 위임한다. State 인터페이스 및 클래스 정의하기 State 인터페이스에는 뽑기 기계에서 일어날 수 있는 모든 행동에 직접적으로 대응함. ins..
요약 상태 패턴 상태 기계 기초 지식 알아보기 뽑기 기계 코드 만들기 알림! 뽑기 기계 코드 수정 요청 요청 사항 살펴보기 메모 CHAPTER 10. 객체의 상태 바꾸기 : 상태 패턴 상태 기계 기초 지식 알아보기 간단한 상태 기계 구현 방법 우선 상태들을 모아 봄. ex) 동전 없음, 동전 있음, 알맹이 매진, 알맹이 판매 → 총 4개의 상태가 있음. 현재 상태를 저장하는 인스턴스 변수를 만들고 각 상태의 값을 정의함. final static int SOLD_OUT = 0; final static int NO_QUATER = 1; final static int HAS_QUATER = 2; final static int SOLD = 3; int state = SOLD_OUT; 이 시스템에서 일어날 수 있..
요약 반복자 패턴과 컴포지트 패턴 컴포지트 패턴으로 메뉴 디자인하기 메뉴 구성 요소 구현하기 메뉴 항목 구현하기 메뉴 구현하기 종업원 코드에 컴포지트 적용하기 디자인 도구상자 안에 들어가야 할 도구들 메모 컴포지트 패턴으로 메뉴 디자인하기 구성 요소 인터페이스를 먼저 만듦. 메뉴와 메뉴 항목 모두에 적용되는 공통 인터페이스 역할을 함. 메뉴와 메뉴 항목을 똑같은 방법으로 처리할 수 있음. → 같은 메소드를 호출할 수 있음. Waitress 클래스는 MenuComponent 인터페이스를 사용해서 Menu와 MenuItem에 모두 접근함. MenuComponent는 MenuItem과 Menu 모두에 적용되는 인터페이스임. MenuItem과 Menu에서 모두 print()를 오버라이드 함. MenuItem에서..
요약 반복자 패턴과 컴포지트 패턴 반복자와 컬렉션 리팩터링 준비하기 컴포지트 패턴의 정의 메모 반복자와 컬렉션 컬렉션과 반복자를 사용하면 모든 컬렉션 객체에서 자신을 대상으로 하는 반복자를 리턴할 줄 안다는 장점을 활용할 수 있음. ArrayList의 iterator() 메소드를 호출하면 ArrayList용 구상 Iterator 클래스가 리턴됨. 구상 클래스의 구현은 신경쓰지 않고, Iterator 인터페이스만 사용하면 됨. HashMap은 반복자를 간접적으로 지원하는 클래스임. 2개의 객체 모듬이 들어있음. → keys, values 값들을 대상으로 반복작업을 하고 싶다면, HashMap 의 values 를 가져온 다음에 반복자를 받아와야 함. 만약, 메뉴 안에 서브 메뉴를 지원해달라고 한다면? ex)..
요약 반복자 패턴과 컴포지트 패턴 단일 역할 원칙 Iterable 인터페이스 알아보기 향상된 for 순환문 알아보기 객체마을 카페 메뉴 살펴보기 객체마을 카페 메뉴 코드 고치기 메모 단일 역할 원칙 집합체에서 내부 컬렉션 관련 기능 반복자용 메소드 관련 기능 전부 구현하면, 한 클래스에 2가지 역할을 가짐. 만약, 컬렉션이 어떤 이유로 바뀌게 되면 그 클래스가 바뀌어야함. 또, 반복자 관련 기능이 바뀌더라도 그 클래스가 바뀌어야 함. 이러한 이유로 ‘변경’과 관련된 디자인 원칙이 추가됨. 📍 디자인 원칙 : 어떤 클래스가 바뀌는 이유는 하나뿐이어야 한다. 클래스를 고치는 일은 최대한 피해야 함. 코드 변경이 일어나면 여러 문제가 발생할 수 있기 때문. 코드 변경 이유가 2가지나 되면, 그만큼 그 클래스를..
요약 반복자 패턴과 컴포지트 패턴 반복자 패턴 객체마을 식당 메뉴에 반복자 추가하기 객체마을 식당 메뉴에서 반복자 사용하기 종업원 코드에 반복자 적용하기 반복자 패턴의 특징 알아보기 인터페이스 개선하기 java.util.Iterator 적용하기 반복자 패턴의 정의 반복자 패턴의 구조 알아보기 메모 반복자 패턴 반복자(iterator) 패턴이라고 부름. Iterator 인터페이스에 의존함. hasNext() 메소드를 사용하면 반복 작업을 적용할 대상이 더 있는지 확인 가능 next() 메소드는 다음 객체를 리턴함. 이 인터페이스가 있으면 배열, 리스트, 해시 테이블은 물론, 모든 종류의 객체 컬렉션에 반복자를 구현할 수 있음. 객체마을 식당 메뉴에 반복자 추가하기 public interface Iterat..
요약 템플릿 메소드 패턴 디자인 도구상자 안에 들어가야 할 도구들 템플릿 메소드 패턴 반복자 패턴과 컴포지트 패턴 객체 마을 식당과 팬케이크 하우스 합병 자격 요건 구현하기 반복을 캡슐화하기 메모 디자인 도구상자 안에 들어가야 할 도구들 템플릿 메소드 패턴 알고리즘의 골격을 정의함. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브클래스에서 재정의할 수도 있음. 컬렉션 잘 관리하기 : 반복자 패턴과 컴포지트 패턴 객체 마을 식당과 팬케이크 하우스 합병 객체마을 식당 메뉴는 배열로 구현함. 팬케이크 하우스는 메뉴를 ArrayList로 구현함. 이 두 식당의 합병 → 메뉴를 통합해야함. 종업원이 각 객체 메뉴들을..