이중 파견
이중 분포는 무엇입니까?
객체 지향 프로그래밍에 대해 이야기 할 때, 우리는 종종 객체 지향적 인 "다형성"에 대해 이야기합니다. 그중에서도 종종 다형성에 대해 "부모 계급이 아동 계급 대상을 가리킨다"는 말이 있습니다.
서브 클래스 객체에 대한이 부모 클래스 참조 점은 다음과 같이 작성됩니다.
동물 동물 = 새로운 개 (); Animal.bark ();
일반적으로 사용되는 또 다른 형태는입니다
공개 클래스 골키퍼 {public void says (동물 a) {system.out.println ( "Animal Says"); } public void Says (Dog Dog) {System.out.println ( "Dog Says"); }} 동물 동물 = 새로운 동물 (); 동물 개 = 새로운 개 (); 골키퍼 골키퍼 = 새로운 골키퍼 (); Keeper.say (동물); Keep.say (개); 위의 골키퍼가 두 번 말할 때 어떤 콘텐츠가 출력됩니까? 두 가지 다른 방법이 호출됩니까?
실제로이 두 호출 중에이 방법은 (동물 A)가 호출 될 것이라고 말합니다. 이러한 내용은 컴파일 기간에 찾을 수 있으므로 Java의 정적 분포입니다.
위의 그림에서, 우리는 두 호출에 의해 생성 된 바이트 코드가 Say (동물 A) 메소드를 가리킨다는 것을 알 수 있습니다. 이 방법은 런타임에 직접 실행되며 해당 콘텐츠는 출력입니다.
해당 Animal.bark ()가 개 클래스의 방법을 부르는 이유는 무엇입니까? 이는 런타임시 특정 방법 수신자의 유형을 결정하고 실행하는 것입니다. 이를 동적 분포라고하며 런타임의 특정 방법을 결정하고 객체 지향 다형성을 구현합니다.
보내다
분포는 실행될 방법을 마무리하는 프로세스를 나타냅니다.
Java와 같은 정적 언어의 경우 모두 단일 분포 (단일 디스패치)를 통해 실행됩니다.
예를 들어 코드 줄입니다
dog.eat(new Bone())
선택할 EAT 방법의 최종 실행은 개의 특정 유형에 따라 해당 메소드 만 선택하며 전달 된 매개 변수는 해당 방법의 선택에 영향을 줄 수 없습니다. 이것은 단일 파견입니다
실제 매개 변수를 전달하려면 Bone은 실제로 역할을 수행하기 위해 여기에 있습니다. 이중 파견 또는 다중 파견을 사용해야합니다.
즉, 최종 결정은 메소드의 수신기 일뿐 만 아니라 매개 변수 유형이기도합니다.
방문자 모드
GOF의 디자인 모드에서 방문자 모드는 이중 파견을 사용하여 실제 객체를 호출하는 목적을 달성합니다.
방문자 모드의 경우 가장 일반적인 예는 트리 트래버스입니다. 예를 들어, 노드와 잎을 처리하는 방법에는 차이가 있습니다. 이는 다른 요소를 구현하고 다른 내용을 실행하기 위해 방문자의 이중 분포를 통해 수행됩니다.
코드는 다음과 같습니다.
node.accept (new ConcreateVisitor ()); Leaf.Accept (New ConcreatEvisitor ());
노드의 수락 메소드는 실제 유형을 다시 방문자에게 전달합니다.
공개 공허 수락 (방문자 v) {v.visit (this); }현재 방문자에서는 실제 유형에 따라 특정 방법을 호출 할 수 있으며 노드 및 리프에 해당하는 방법과 유사한 방법이 있습니다.
공공 공간 방문 (노드 N); 공공 공허 방문 (잎 L);
요약하려면 방문자는 일반적으로 방문자 인터페이스를 포함합니다. 방문자 인터페이스에는 액세스 할 각 요소 객체의 처리 로직이 포함되어 있습니다. 각 요소의 특정 구현에서는 정확한 로직 호출을 구현하기 위해 보조 분포를 위해 자신의 유형을 방문자에게 다시 전달합니다.
Tomcat의 응용 프로그램
방문자는 또한 Tomcat, 일반적으로 El 표현을 구문 분석하는 Tomcat에서도 사용됩니다.
예를 들어 org.apache.el.parser.node
이 클래스에는 수락 (Nodevisitor Visitor) 메소드가 포함되어 있습니다
실제 노드 유형이 많이 있지만 실제 호출시 이시에는 통과합니다.
Public Void acccep (Nodevisitor Visitor)는 예외 {visitor.visit (this);실제 유형을 방문자에게 다시 전달하면 바이저에서 특정 방법이 호출되어 매개 변수가 결정적인 역할을 할 수 있습니다.
public void visit (노드 노드)는 elexception {if (node instanceof astfunction) {astfunction funcnode = (astfunction) 노드; 메소드 m = null; } else if (xxx) {} 여기에서 여러 방문 방법이 선언되며 위의 방문 (이)은 대상 방법에 직접 위치합니다.
위의 것은 Java의 다양한 분포와 방문자 모델이 패턴 형태를 통해 이중 분포를 달성합니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨주세요. 편집자는 제 시간에 모든 사람에게 답장 할 것입니다!