23 디자인 패턴 16 장 : Java 방문자 패턴
정의 : 특정 데이터 구조에서 각 요소에 작용하는 특정 작업을 캡슐화합니다. 데이터 구조를 변경하지 않고 이러한 요소에 작용하는 새로운 작업을 정의 할 수 있습니다.
유형 : 행동 패턴
클래스 다이어그램 :
방문자 모드는 행동 모드 중에서 가장 복잡한 모드 일 수 있지만 이것이 우리가 마스터하지 않는 이유는 아닙니다.
먼저 간단한 예를 살펴 보겠습니다. 코드는 다음과 같습니다.
클래스 A {public void method1 () {System.out.println ( "I am A"); } public void method2 (b b) {b.showa (this); }} 클래스 B {public void showa (a) {a.method1 (); }}클래스 A에서 메소드 메소드 1과 메소드 메소드 2의 차이점이 무엇인지 살펴 보겠습니다. 메소드 방법 1은 매우 간단합니다. 문장 "I am"을 인쇄하십시오. Method Method2는 조금 더 복잡하고 클래스 B를 매개 변수로 사용하고 클래스 B의 Showa 메소드를 호출하십시오.
클래스 B의 showa 메소드를 살펴 보겠습니다. showa 메소드는 클래스 A를 매개 변수로 사용한 다음 클래스 A의 메소드 메소드를 호출합니다. Method2 메소드가 자체 메소드 메소드를 호출하고 있음을 알 수 있습니다. 실행 결과는 또한 "I am"이어야합니다. 분석 후이 두 가지 방법을 실행하고 실행 결과를 확인해 봅시다.
공개 클래스 테스트 {public static void main (String [] args) {a a = new a (); a.method1 (); a.method2 (new b ()); }}실행 결과는 다음과 같습니다.
나는이다
나는이다
이 예를 이해 한 후에는 방문자 패턴의 90%를 이해하게됩니다. 예에서 클래스 A의 경우 클래스 B는 방문자입니다. 그러나이 예는 전체 방문자 모드가 아닙니다. 직관적이지만 확장 성이 좋지 않습니다. 방문자 모드의 일반적인 구현에 대해 이야기 해 봅시다. 클래스 다이어그램을 통해 방문자 모드에서 다음 역할이 주로 포함되어 있음을 알 수 있습니다.
초록 방문자 : 방문자가 액세스 할 수있는 요소를 선언하는 추상 클래스 또는 인터페이스. 구체적으로 프로그램에서 방문 방법의 매개 변수는 액세스 할 수있는 객체를 정의합니다.
방문자 : 초록 방문자가 선언 한 방법을 구현하는데, 이는 방문자가해야 할 일과 수업에 액세스 한 후해야 할 일에 영향을 미칩니다.
초록 요소 클래스 : 어떤 유형의 방문자 액세스가 허용되는지 선언하는 인터페이스 또는 초록 클래스. 이 프로그램은 수락 방법의 매개 변수를 통해 정의됩니다. 추상 요소에 대한 두 가지 유형의 방법이 있으며, 하나는 자체 비즈니스 논리이며, 다른 하나는 방문자 유형에 액세스 할 수있는 유형입니다.
요소 클래스 : 초록 요소 클래스 (일반적으로 방문자)에 의해 선언 된 수락 방법을 구현하고 기본적으로 고정식 공식을 형성했습니다.
구조 객체 : 요소 컨테이너에는 일반적으로 목록, 세트, 맵 등과 같은 여러 다른 클래스와 인터페이스를 수용하는 컨테이너가 포함되어 있습니다.이 역할은 프로젝트에서 거의 추상화되지 않습니다.
방문자 모드의 일반적인 코드 구현
추상 클래스 요소 {public acpract void accept (ivisitor Visitor); 공개 초록 void dosomething (); } 인터페이스 ivisitor {public void visit (ConcreteElement1 El1); 공공 무효 방문 (Concreteelement2 EL2); } class concreteElement1은 extends 요소 {public void dosomething () {System.out.println ( "this is is emect 1"); } public void acccep (ivisitor visitor) {visitor.visit (this); }} Class ConcreteElement2 Extends 요소 {public void dosomething () {System.out.println ( "this is is emect 2"); } public void acccep (ivisitor visitor) {visitor.visit (this); }} 클래스 방문자는 ivisitor {public void visit (ConcreteElement1 el1) {el1.dosomething (); } public void visit (ConcreteElement2 El2) {el2.dosomething (); }} class ObjectStruture {public static list <ementt> getList () {list <ELTECT> list = new ArrayList <ELECT> (); 랜덤 ran = new random (); for (int i = 0; i <10; i ++) {int a = ran.nextint (100); if (a> 50) {list.add (new ConcreteElement1 ()); } else {list.add (new ConcreteElement2 ()); }} 리턴 목록; }} public class client {public static void main (string [] args) {list <ement> list = ObjectStruture.getList (); for (요소 e : list) {e.accrect (new visitor ()); }}} 방문자 모드의 장점
단일 책임의 원칙을 준수하십시오 : 방문자 모드가 적용 가능한 모든 시나리오에서 요소 클래스의 방문자에 캡슐화되어야하는 작업은 요소 클래스 자체와 거의 관련이없고 휘발성이라는 작업이어야합니다. 한편으로, 방문자 모드의 사용은 단일 책임의 원칙을 준수하며, 다른 한편으로는 캡슐화 된 작업이 일반적으로 변동성이기 때문에 변화가 발생할 때 변화 부품의 확장은 요소 클래스 자체를 변경하지 않고 달성 될 수 있기 때문입니다.
우수한 확장 성 : 요소 클래스는 다른 방문자를 수락하여 다른 작업을 확장 할 수 있습니다.
방문자 모드에 적용 가능한 시나리오
객체와 관련이없는 객체에 일부 작업이 있고 (또는 약한 관련) 및 이러한 작업이 객체를 오염시키는 것을 피하기 위해 방문자 모드를 사용하여 이러한 작업을 방문자에 캡슐화 할 수 있습니다.
객체 그룹에 유사한 작업이있는 경우 많은 수의 중복 코드를 피하기 위해 이러한 중복 작업을 방문자에 캡슐화 할 수도 있습니다.
그러나 방문자 모드는 그다지 완벽하지 않으며 치명적인 결함도 있습니다. 새로운 요소 클래스를 추가하는 것이 더 어렵습니다. 방문자 패턴의 코드를 통해 방문자 클래스에서 각 요소 클래스에 해당 처리 방법이 있음을 알 수 있습니다. 즉, 방문자 클래스 (방문자 클래스의 서브 클래스 또는 구현 클래스 포함)를 수정하기 위해 각 요소 클래스를 추가해야합니다. 즉, 요소 클래스의 수가 확실하지 않은 경우 방문자 모드를주의해서 사용해야합니다. 따라서 방문자 모드는 기존 기능을 리팩토링하는 데 더 적합합니다. 예를 들어, 프로젝트의 기본 기능이 결정되면 요소 클래스의 데이터가 기본적으로 결정되었으며 변경되지 않습니다. 변경 될 모든 것은 이러한 요소 내의 관련 작업입니다. 현재 방문자 모드를 사용하여 원래 코드를 리팩터링하여 각 요소 클래스를 수정하지 않고 원래 기능을 수정할 수 있습니다.
요약
Design Pattern의 저자 인 GOF는 방문자 모드를 설명합니다. 대부분의 경우 방문자 모드를 사용해야하지만 필요하면 필요한 경우 실제로 필요합니다. 물론 이것은 진짜 큰 사람들을위한 것입니다. 실제로 (적어도 내가있는 환경에서) 많은 사람들이 종종 디자인 패턴에 중독되어 있습니다. 디자인 패턴을 사용할 때 사용중인 패턴 이이 시나리오에 적합한 지 여부를 심각하게 고려하지 않지만 종종 객체 지향 디자인을 제어하는 능력을 보여주기를 원합니다. 프로그래밍 할 때 이러한 정신이 있다면 종종 디자인 패턴을 남용합니다. 따라서 디자인 패턴을 학습 할 때는 패턴의 적용 가능성을 이해해야합니다. 패턴을 이해하기 때문에 패턴을 사용하고 패턴을 사용하지 않기 때문에 패턴을 사용하지 않기 때문에 단점을 이해하기 때문입니다. 단점을 이해하지 못하기 때문에 패턴을 사용하는 대신, 장점을 이해하지 못하기 때문에 패턴을 사용하지 않기 때문입니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.