냥쟝
반응형

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로 참조되는 객체에 그행동을 위임

 

<java />
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()메소드에 코드를 추가

 

추가목표

-확장성 =다른 개발자가 새로운 디스플레이를 만들고, 사용자가 마음대로 디스플레이 요소를 더하거나 뺄 수 있게 해준다

<code />
public class WeatherData { //인스턴스 변수 선언 public void measurmentChaged() { float temp = getTempperature();

currentCondirionsDisplay.update(temp,humidity,pressure);

//   각디스플레이를 

 

구체적인 구현에 맞춰서 코딩했으므로 프로그램을 고치지 않고는 다른 디스플레이 항목을 추가하거나 제거할 수 없다

디스플레이 항목과 데이터를 주고받는 데 적어도 공통된 인터페이스를 사용하고 있는거 같다

 

Q:실행중에 디스플레이를 더하거나 빼려면 어떻게 해야할까?

 

신문사+구독자 = 옵저버 패턴

int-> dog /cat/mouse (옵저버 객체들은 주제를 구독하고 있으며/주제 객체에 등록되어 있으며)주제 데이터가 바뀌면 

갱신 내용을 전달받습니다

 

주제 객체->dog,cat,mouse//옵저버 객체들은 주제를 구독 주제데이터가 바뀌면 갱신내용을 전달 받습니다

 

옵저버 패턴의 작동원리

옵저버 패턴: 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 

일대다의존성을 정의합니다

 

옵저버 패턴은 일련의 객체사이에서 일대다 관계를 정의합니다 한 객체의 상태가 변경되면 그 객체에 의존하는

모든 객체에 연락이 갑니다

 

느슨한 결합의 위력

느슨한 결합: 객체들이 상호작용할 수는 없지만, 서로 잘 모르는 관계를 의미한다

 

 

 

 

 

 

profile

냥쟝

@냥쟝

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!