방문자 모드 : 특정 데이터 구조에서 각 요소에 작용하는 일부 작업을 캡슐화합니다. 이 데이터 구조를 변경하지 않고 이러한 요소에 작용하는 새로운 작업을 정의 할 수 있습니다. 방문자 모드의 구조 다이어그램은 다음과 같습니다.
위 그림에서 다음 캐릭터가 있음을 알 수 있습니다.
초록 방문자 역할 : 인터페이스를 정의하고 하나 이상의 액세스 작업을 선언합니다.
구체적인 방문자 역할 : 추상 방문자가 선언 한 인터페이스, 즉 추상 방문자가 선언 한 다양한 액세스 작업을 구현합니다.
초록 요소 (방문 가능한) 역할 : 수락 작업을 선언하고 방문자 객체를 매개 변수로 수락합니다.
구체적인 규정 역할 : 추상 노드에 의해 지정된 수락 작업을 구현합니다.
데이터 구조 객체 (ObjectStructure) 역할 : 구조의 모든 요소를 가로 지르고 방문자 객체가 각 요소에 액세스 할 수있는 인터페이스를 제공 할 수 있습니다.
시뮬레이션 코드는 다음과 같습니다.
인터페이스 방문자 {void visit (gladiolus g); 무효 방문 (국화 C); } // 콘크리트 방문자 이름 액세스 클래스 StringVisitor는 방문자 {문자열 s; public String toString () {return s; } public void 방문 (Gladiolus g) {s = "gladiolus"; } 공개 무효 방문 (Chrysanteumum c) {s = "chrysanteumum"; }} // 콘크리트 방문자 클래스 Beevisitor는 방문자 {public void visit (gladiolus g) {system.out.println ( "gladiolus에 액세스하기위한 꿀벌"); } public void visit (Chrysanteum c) {System.out.println ( "Chrysanteum에 액세스하기위한 벌"); }} 인터페이스 꽃 {void acccep (방문자 V); }/ * * 콘크리트 요소 Chrysanthemum은 꽃을 구현합니다. }}
// 콘크리트 요소 클래스 Gladiolus는 꽃을 구현합니다. }}
// 이것은 꽃 객체 생성기 클래스 플라워 게이터 {private static random rand = new random (); public static flower newflower () {switch (rand.nextint (2)) {기본값 : Case 0 : return new gladiolus (); 사례 1 : 새로운 국화 ()를 반환합니다 (); }}} 공개 수업 테스트 { / * * 먼저 고객에게 특정 방문자 역할을 수행하십시오. 객체 구조가 횡단됩니다. 각 요소에 대한 수락 방법을 호출하고 특정 방문자 역할을 전달합니다. 전체 프로세스*/ public static void main (String args []) {list <flower> flowers = new Arraylist <flower> (); for (int i = 0; i <10; i ++) flowers.add (flowergenerator.newflower ()); 방문자 방문자 = 새 StringVisitor (); Ierator <flower> iterator = flowers.iterator (); while (iterator.hasnext ()) {iterator.next (). accept (방문자); System.out.println (방문자); } system.out.println ( "------------------------"; /** 새로운 액세스 동작 : Beevisitor Bee Access*/ Visitor Visitor2 = new Beevisitor (); for (꽃 꽃 : 꽃) {flower.ccept (visitor2); }}}결과:
Gladiolus 국화 국화 국화 gladiolus 국화 국화 국화 국화 gladiolus gladiolus ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
방문자 모드는 다음과 같은 경우 고려할 수 있습니다.
1. 객체 구조에는 많은 클래스 객체가 포함되어 있으며 인터페이스가 다르며 이러한 객체의 특정 클래스에 의존하는 일부 작업을 구현하려고합니다.
2. 객체 구조의 객체에 대해 여러 가지 다른 및 관련없는 작업을 수행해야하며 이러한 작업이 이러한 객체의 클래스를 "오염"하도록하지 않기를 원합니다. 방문자를 사용하면 관련 작업에 집중하여 수업에서 정의 할 수 있습니다.
3. 객체 구조가 많은 응용 프로그램에서 공유되는 경우 방문자 모드를 사용하여 각 응용 프로그램에 사용해야하는 작업 만 포함하도록합니다.
4. 객체 구조를 정의하는 클래스는 거의 변하지 않지만이 구조를 정의하기 위해 종종 새로운 작업이 필요합니다. 객체 구조 클래스를 변경하려면 모든 방문자에 대한 인터페이스를 재정의해야하므로 비용이 많이들 수 있습니다. 객체 구조 클래스가 자주 변경되면 이러한 클래스에서 이러한 작업을 정의하는 것이 좋습니다.
이 개인들은 제안 인 것으로 보이며 프로젝트에서 특정 문제를 분석해야합니다.