Behavioral 모드의 Visitor 모드

4744 단어 패턴
1. 의도
객체 구조에 작용하는 요소의 작업을 나타냅니다.그것은 너로 하여금 각 원소의 종류를 바꾸지 않는 전제에서 이 원소에 작용하는 새로운 조작을 정의할 수 있게 한다.
2. 별명
없음
3. 동기
컴파일러를 고려해서, 그는 원본 프로그램을 추상적인 문법 트리로 표시했다.이 컴파일러는 모든 변수가 정의되었는지 확인하는 등 추상적인 문법에서 '정적 의미' 분석을 실시해야 한다.그도 코드를 생성해야 한다.코드 검사, 코드 최적화, 절차 분석, 변수가 사용 전에 초기값이 부여되었는지 확인하기 위해 많은 조작을 정의할 수 있기 때문이다.또한 추상적인 문법 트리를 사용하여 아름다운 형식의 인쇄, 프로그램 재구성, 코드 instrumentation 및 대상을 다양한 도량으로 인쇄할 수 있다.
4. 적용성
Visitor 모드는 다음과 같습니다.
  • 하나의 대상 구조에는 여러 종류의 대상이 포함되어 있는데 그들은 서로 다른 인터페이스를 가지고 있기 때문에 이러한 대상에 대해 구체적인 유형에 의존하는 조작을 실시하고 싶다.
  • 하나의 대상 구조 중의 대상에 대해 여러 가지 다르고 관련이 없는 조작을 해야 한다.이 조작들이 대상을 오염시키는 클래스를 피하고 싶습니다. Visitor는 관련 조작을 하나의 클래스에 집중적으로 정의할 수 있습니다. 이 대상 구조가 많은 응용 프로그램에서 공유될 때, Visitor 모드로 모든 응용 프로그램에 필요한 조작만 포함하도록 합니다.
  • 정의 대상 구조의 종류는 거의 바뀌지 않지만 이를 바탕으로 새로운 조작을 정의해야 한다.대상 구조 클래스를 바꾸려면 모든 대상 방문자에 대한 인터페이스를 재정의해야 하는데, 이것은 많은 대가를 필요로 할 수 있다.만약 대상 구조 클래스가 자주 바뀐다면, 아마도 이런 클래스에서 이러한 조작을 정의하는 것이 비교적 좋을 것이다.

  • 5. 구조
    방문자 모델은 데이터 구조와 구조에 작용하는 조작해의 결합을 통해 조작 집합을 상대적으로 자유롭게 진화시킬 수 있다.방문자 모델은 데이터 구조가 상대적으로 안정적이고 알고리즘이 변하기 쉬운 시스템에 적용된다.방문자 패턴 때문에 알고리즘 조작이 쉬워졌습니다.만약에 시스템 데이터 구조의 대상이 쉽게 변화하고 자주 새로운 데이터 대상이 증가하면 방문자 모델을 사용하는 데 적합하지 않다.방문자 모드의 장점은 추가 조작이 매우 쉽다는 것이다. 왜냐하면 추가 조작은 새로운 방문자를 증가시키는 것을 의미하기 때문이다.방문자 모드는 시스템 데이터 구조에 영향을 주지 않고 관련 행위를 한 방문자 대상에 집중시킨다.그 단점은 새로운 데이터 구조를 늘리는 것이 어렵다는 것이다.From 백과사전은 간단하게 말하자면 방문자 모델은 대상의 데이터 구조와 행위를 분리하는 방법이다. 이런 분리를 통해 방문자에게 다른 수정 없이 동적으로 새로운 조작을 추가할 수 있다.단순 다이어그램:
    6. 코드 예
    원본을 보십시오: 방문할 대상을 저장하고 코드를 구현하는 Visitor 클래스: 상태 구조:
    public interface Visitor {
        public void visit(Subject sub);
    }
    
    public class MyVisitor implements Visitor {
    
        @Override
        public void visit(Subject sub) {
            System.out.println("visit the subject:"+sub.getSubject());
        }
    }

    Subject 클래스, accept 방법, 접근할 대상을 받아들이고 getSubject () 는 접근할 속성을 가져옵니다.
    public interface Subject {
        public void accept(Visitor visitor);
        public String getSubject();
    }
    
    public class MySubject implements Subject {
    
        @Override
        public void accept(Visitor visitor) {
            visitor.visit(this);
        }
    
        @Override
        public String getSubject() {
            return "love";
        }
    }

    테스트 클래스:
    public class Test {
    
        public static void main(String[] args) {
    
            Visitor visitor = new MyVisitor();
            Subject sub = new MySubject();
            sub.accept(visitor);    
        }
    }

    출력:visit thesubject: love 이 모델은 장면에 적용됩니다. 만약에 우리가 기존의 클래스에 새로운 기능을 추가하고 싶다면 몇 가지를 고려해야 합니다. 1. 새로운 기능이 기존 기능과 호환성에 문제가 생기지 않을까요?2、나중에 추가해야 하지 않을까요?3. 클래스가 코드를 수정하는 것을 허락하지 않으면 어떻게 합니까?이런 문제에 직면하면 가장 좋은 해결 방법은 방문자 모델을 사용하는 것이다. 방문자 모델은 데이터 구조가 상대적으로 안정적인 시스템에 적용되고 데이터 구조와 알고리즘을 결합시킨다.
    7. 관련 모드
  • Composite 모드: 방문자는 Composite 모드에 의해 정의된 대상 구조를 조작하는 데 사용할 수 있다.
  • Interpreter 모드: 방문자는 해석에 사용할 수 있습니다.

  • 참조:
    http://openhome.cc/Gossip/DesignPattern/DecoratorPattern.htm http://item.jd.com/10057319.html http://blog.csdn.net/zhangerqing/article/details/8239539

    좋은 웹페이지 즐겨찾기