Study/Design Pattern 5

Observer Pattern

옵서버 패턴 : 데이터의 변경 발생했을 때 상대 클래스/객체에 의존 하지 않고 데이터 변경을 통보하고자 할 때 유용함. ▶ 예로, 차량의 연료가 소진될 때 까지 주행 가능 거리 출력하는 클래스, 연료량 부족 경고 메시지 보내는 클래스 등에 연료량의 변화를 통보하는 경우가 있는데, 이럴 때 연료량 클래스는 연료량에 관심 갖는 구체적 클래스(주행 가능 거리 출력, 연료량 부족 경고, 주변 주유소 검색)에 직접 의존하지 않는 방식으로 설계하는 것이 바람직! 옵서버 패턴은 통보 대상 객체의 관리를 Subject 클래스와 Observer인터페이스로 일반화함 ▷ 데이터 변경을 통보하는 클래스(ConcreteSubject)는 통보 대상 클래스/객체(ConcreteObserver)에 대한 의존성 없앨 수 O ▷ 옵서버..

Command Pattern

커맨드 패턴 : 이벤트가 발생했을 때 실행될 기능이 다양하면서 변경이 필요한 경우 이벤트를 발생시키는 클래스의 변경 없이 재사용 하고자 할 때! ▶ 실행될 기능을 캡슐화 함으로써 기능의 실행 요구하는 호출자 클래스와 실제 기능 실행하는 수신자 클래스 사이의 의존성 제거 따라서, 실행될 기능 변경에도 호출자 클래스를 수정하지 않고 그대로 사용할 수 있도록 해줌! (버튼 눌렀을 때의 기능을 캡슐화 함으로써, 알람을 울리게 하든 램프를 키게 하든 버튼 클래스의 소스 코드 변경 없도록 함) 버튼 클래스와 Alarm, Lamp 클래스 사이의 의존성 없앰! ▶ 커맨드 패턴은 변화되는게 전략/알고리즘/비즈니스 규칙 이 아닌, 기능이 변함! Command 패턴 용어 - Invoker : 기능의 실행 요청하는 호출자 클..

Strategy Pattern

▷ 이 설계방식은 새 로봇 추가하기에 좋음. 클래스 자체가 하나의 로봇을 모델링 하고 표현하기 때문! (변화의 단위=클래스) * attack(), move() → 추상메소드 (이탤릭체) 문제점? 기존 로봇의 공격/이동 방법 수정하려면 어떤 변경 작업이 필요한가? 예로, 아톰이 날 순 없고 걷게만 만들고 싶다면? (= 공격 알고리즘 변경 해야함) 혹은 태권V 날게 하려면? → OCP 위반! (기존코드 변경시킴) 새로운 로봇 만들어 기존의 공격/이동 방법 추가/수정 하려면? 예로, 새로운 로봇으로 선가드 클래스를 만들어 태권V의 미사일 공격 기능 추가하려면? → 중복부분이 많기 때문에 변경사항이 생길 때 힘듦. 로봇 추가는 전혀 문제 없지만, 공격/이동 알고리즘 변경될 때 문제임. (각각 클래스로 모델링 된..

빌더 패턴

빌더 패턴이란? 객체 생성 패턴 ▶ 생성자의 인자가 많은 경우 ▶ Immutable 객체 (변경할 수 없는 객체)를 생성하고 싶은 경우 (수정 불가한 객체) ▶ 생성자의 인자들 중 반드시 데이터를 제공해야 하는 필수적 인자와 없어도 되는 선택적 인자가 혼합돼있는 경우 Telescoping Constructor 패턴 (점층적 생성자 패턴) ▷ 생성자 점점 추가시켜 속성 정보 설정해 객체 생성! ▷ 필수 인자를 받는 생성자 정의 후에 선택적 인자 추가로 받는 생성자 계속해서 정의 점층적 생성자 패턴의 문제점 (Telescoping Constructor 패턴) 1. 인자가 많을수록 생성자 개수 많아짐 2. 생성자의 인자가 어떤 의미인지 파악 힘듦 (intellij에선 매개변수가 나오기 때문에 알고 있지만, 이..

객체지향원리

추상화 모델링은 '추상화'에 바탕을 둠 : 특정 관점에서 관련 있는 건 부각시키고, 관련 없는건 무시 어떤 영역에서 필요로 하는 속성/행위를 추출하는 작업 (관심 있는 부분에 집중 가능!) 캡슐화 : 관련 있는 것들 끼리 모아놓음 클래스는 캡슐화를 제공하는 수단으로, 서로 관 련있는 속성/메소드로 구성돼있다. '요구사항의 변경'은 소프트웨어 개발의 골칫거리인데, 이에 대한 해결법은 요구사항 변경을 당연하다고 생각하고 이에 대비하는 것이다. '캡슐화'를 통해 높은 응집도와 낮은 결합도를 갖는 설계를 한다! 결합도를 낮게 하려면? '정보 은닉(information hiding)' - private, public 등 이용 중요한 정보에 직접적으로 접근 하는 것이 X (허용된 것만 사용해 접근) → 정보 내용 ..