간단 한 디자인 모드 의 Observer (관찰자) 모드

다음 과 같은 상황 을 고려 합 니 다.
class A{
	functionA(){
		1;
	}
}

1. 우 리 는 functionA () 의 기능 을 확대 하고 싶 습 니 다.2. 우 리 는 서로 다른 상황 에서 functionA () 가 서로 다른 실현 (다 형) 이 있 기 를 바란다.다 태 를 생각하면 우 리 는 계승 으로 실현 할 생각 을 할 수 있다.
class childA extends A{
	functionA(){
		1;
		2;
	}
}

class childB extends A{
	functionA(){
		1;
		3;
	}
}

위의 방식 은 평소에 각종 다 중 기능 을 실현 할 때 자주 사용 된다. 대상 을 대상 으로 프로 그래 밍 하 는 기본 원칙 은 대상 을 대상 으로 하 는 것 이 아니 라 인터페이스 프로 그래 밍 이다. 따라서 우 리 는 상기 방식 에 대해 추상 적 이 고 template method 템 플 릿 방법 모델 로 상기 상황 을 실현 한다.
abstract class A{
	functionA(){
		1;
		functionB()
	}
	abstract functionB();
}

class childA extends A{
	functionA(){
		1;
		2;
		functionB();
	}
	functionB(){
		...
	}
}

'자바 프로 그래 밍 사상' 이라는 책 에서 계승 을 사용 하 는 것 은 childA 와 A 가 논리 적 으로 강 한 연관 성 을 가지 기 때 문 이 라 고 언급 한 것 을 기억한다. 즉, childA is like A 이다.이들 이 강 한 연관 성 이 없다 면 상속 을 통 해 이 같은 상황 을 이 루 기 위해 서다.그렇다면 상속 을 사용 하 는 것 은 적절 한 선택 이 아니 라 '상속' 이라는 단어의 의미 에 엄 격 히 위배 된다.우 리 는 계승 을 제외 하고 조합 도 대상 언어 에서 다 형 을 실현 하 는 중요 한 방법 이라는 것 을 안다.먼저 다음 과 같은 조합 으로 이 루어 진 상기 상황 을 살 펴 보 자.
class A{
	B b = new childB1();
	functionA(){
		b.functionB();
	}
	
}

interface B{
	functionB();
}

class childB1 implements B{
	functionB(){

	}
4. 567913. 이들 의 차 이 를 발 견 했 습 니까? 류 A 에서 attach () 방법 으로 동태 적 으로 B 대상 을 불 러 왔 습 니 다. 이 말 을 하면 평소에 만 나 고 싶 었 던 많은 안 드 로 이 드 소스 코드 와 어디서 많이 본 듯 한 느낌 이 듭 니 다.함수 와 클래스 이름 을 바 꾸 면 알 수 있 습 니 다.
}

, B , B b = new childB1()。 , , , new childB1() B , , A childB1 , , , :

class A{
	B b;
	functionA(){
		attach(new childB1());
		b.functionB();
	}
	attach(B b){
		this.b = b;
	}
	
}

interface B{
	functionB();
}

class childB1 implements B{

	functionB(){

	}
}
이것 이 바로 관찰자 모델 이다.이 모델 의 원인 은 우리 가 상기 실제 상황 에서 얻 을 수 있다. 그의 장점 은 GOF 가 이 모델 에 대한 정리 설명 을 통 해 '우 리 는 일치 성 을 유지 하기 위해 각종 긴밀 한 결합 을 하고 싶 지 않다. 왜냐하면 이것 은 그들의 중용 성 을 낮 추 었 기 때문이다'. 즉, 우 리 는 유형 A 가 기능 적 으로 유형 B 에 대한 의존성 을 유지 하지만 우 리 는 이들 의 결합 성 이 너무 강하 기 를 원 하지 않 는 다.관찰자 모드 는 이 점 을 잘 해 냈 다.

좋은 웹페이지 즐겨찾기