fly() quack()문제를 제외하면 Duck 클래스는 잘 작동하고 있으며,
Duck 클래스는 그대로 두는 게 좋다
'변화하는 부분과 그대로 있는 부분'을 분리 (Duck 클래스와는 완전히 별개로) 2개의 클래스 집합을 만들어야함
fly()와 quack() 문제를 제외하면 Duck클래스는 잘 작동하고 있으며,
Duck 클래스는 그대로 두는것이 좋다
변화하는 부분과 그대로 있는 부분을 분리할려면 (Duck클래스와는 완전히 별개로)2개의 클래스 집합을 만들어야한다
duck 클래스 바뀌는 부분뽑아내기 -> 나는 행동 , 꽥꽥거리는 행동
Duck클래스에 flyBehavior와 quackBehavior라는 인터페이스 형식의 인스턴스 변수를 추가한다
FlyBehavior와 QuackBehavior 인터페이스로 옮겨놧으므로 Duck 클래스와 모든 서브클래스에서 fly()와 quack()대신
performFly()와 performQuack()이라는메소드를 넣습니다
public abstract class Duck
QuackBehavior quackBkehavior;// 모든 duck에는 quackBkehavior구현하는 것의 레퍼런스가 있다
//기타 코드
public void performQuack(){
quackBehavior.quack(); //꽥꽥거리는 행동을 직접처리하는 대신, quackBehavior로 참조되는 객체에 그행동을 위임
public class MalllardDuck extends Duck{
public MallarDuck() {
quackBehavior = new Quack();
flyBehavop = new FlyWithWings();
}
public void display(){
System.out.println("저는 물오리 입니다");
}
}
오리 코드 테스트
public abstrack class Duck{
FlyBehavior flyBehaivor;
QuackBehavior quackBehavior;
public Duck(){}
public abstract void display();
public void performFly() {
flyBehavior.fly();
}
public void swim() {
System.out.println("모든 오리는 물에 뜹니다. 가짜오리도 뜨죠");
}
}
동적으로 행동지정하기
오리의 행동 형식을 생성자에서 인스턴스를 만드는 방법이 아닌 Duck 서브클래스에서 세터 메소드를 호출하는
방법으로 설정할 수 있지 않을까요?
캡슐화된 행동 살펴보기
-캡슐화된 나는 행동
-캡슐화된 꽥꽥거리는 행동
두클래스를 합치는 방법
-구성을 이용한다
디자인 원칙 -상속보다는 구성을 활용한다
원칙 - 추상화 캡슐화,,,
객체지향 기초
-추상화,캡슐화,다형성,상속
객체지향 원칙
-바뀌는 부분은 캡슐화한다
-상속보다는 구성을 활요한다
-구협보다는 인터페이스에 맞춰서 프로그래밍하낟
객체지향 패턴
전략패턴- 알고리즘
객체들에게 연락 돌리기
옵저버 패턴
가상모니터링 애플리케이션 알아보기
WeatherData클래스 살펴보기
-wheatherData클래스는 3가지 측정값메소드가 있다
-새로운 기상 측정데이터가 들어올때마다 measurementsChanged()메소드가 호출
-기상 데이터를 사용하는 디스플레이 요소 3가지 구현
-디스플레이를 업데이트하도록 mesurmentsChanged()메소드에 코드를 추가
추가목표
-확장성 =다른 개발자가 새로운 디스플레이를 만들고, 사용자가 마음대로 디스플레이 요소를 더하거나 뺄 수 있게 해준다
public class WeatherData {
//인스턴스 변수 선언
public void measurmentChaged() {
float temp = getTempperature();
currentCondirionsDisplay.update(temp,humidity,pressure);
// 각디스플레이를
구체적인 구현에 맞춰서 코딩했으므로 프로그램을 고치지 않고는 다른 디스플레이 항목을 추가하거나 제거할 수 없다
디스플레이 항목과 데이터를 주고받는 데 적어도 공통된 인터페이스를 사용하고 있는거 같다
Q:실행중에 디스플레이를 더하거나 빼려면 어떻게 해야할까?
신문사+구독자 = 옵저버 패턴
int-> dog /cat/mouse (옵저버 객체들은 주제를 구독하고 있으며/주제 객체에 등록되어 있으며)주제 데이터가 바뀌면
갱신 내용을 전달받습니다
주제 객체->dog,cat,mouse//옵저버 객체들은 주제를 구독 주제데이터가 바뀌면 갱신내용을 전달 받습니다
옵저버 패턴의 작동원리
옵저버 패턴: 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는
일대다의존성을 정의합니다
옵저버 패턴은 일련의 객체사이에서 일대다 관계를 정의합니다 한 객체의 상태가 변경되면 그 객체에 의존하는
모든 객체에 연락이 갑니다
느슨한 결합의 위력
느슨한 결합: 객체들이 상호작용할 수는 없지만, 서로 잘 모르는 관계를 의미한다