디자인 모드: 방문 자 모드 (Vistor)

6664 단어 디자인 모드
방문 자 모드 는 특정한 대상 구조 에 작용 하 는 각 요소 의 조작 을 나타 내 고 각 요소 류 를 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 조작 을 정의 할 수 있 습 니 다.
방문 자 모델 의 목적 은 특정한 데이터 구조 요소 에 가해 진 조작 을 밀봉 하 는 것 이다. 이런 조작 이 수정 이 필요 하면 이 조작 을 받 아들 이 는 데이터 구 조 는 변 하지 않 을 수 있다.서로 다른 유형의 요소 에 다양한 접근 조작 방식 을 제공 하고 기 존 시스템 을 수정 하지 않 은 상태 에서 새로운 조작 방식 을 추가 할 수 있다. 이것 이 바로 방문 자 모델 의 모델 동기 이다.
방문 자 모델 은 특정한 대상 구조 에 작용 하 는 각 요소 의 조작 을 나타 내 고 우 리 는 각 요소 의 유형 을 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 조작 을 정의 할 수 있다.
방문 자 모델 은 데이터 구조 가 상대 적 으로 안정 적 인 시스템 에 적용 되 고 변화 하기 쉬 운 알고리즘 도 있다.
방문 자 모드 의 역할: 1. 방문 자 역할 (Visitor): 추상 적 인 클래스 나 인터페이스, 방문 자가 그 요 소 를 방문 할 수 있 음 을 설명 합 니 다. 구체 적 으로 프로그램 에서 visit 방법 중의 매개 변 수 는 어떤 대상 이 방문 할 수 있 는 지 정의 합 니 다.2. 구체 적 인 방문 자 역할 (Concrete Visitor): 모든 방문 자 역할 (Visitor) 성명 을 실현 하 는 작업.3. 요소 역할 (Element): 추상 적 인 클래스 나 인터페이스, Accept 작업 을 정의 하고 어떤 방문 자의 방문 을 받 는 지 설명 합 니 다.추상 적 인 요소 역할 은 보통 두 가지 방법 이 있 는데 하 나 는 자체 의 업무 논리 이 고 다른 하 나 는 어떤 방문 자 를 받 아들 여 방문 할 수 있 는 지 하 는 것 이다.4. 구체 적 인 요소 캐릭터 (Concrete Element): 요소 캐릭터 가 제공 하 는 Accept 작업 을 실현 합 니 다.5. 대상 구조 역할 (Object Structure): 방문 자 모드 를 사용 하 는 데 필수 적 인 역할 입 니 다.그것 은 그것 의 요 소 를 매 거 할 수 있 는 특징 을 가 져 야 한다.방문 자가 요 소 를 방문 할 수 있 도록 고 층 인 터 페 이 스 를 제공 할 수 있 습 니 다.하나의 목록 이나 무질서 한 집합 같은 복합 (조합) 또는 집합 일 수 있 습 니 다.
사례 1 방문 자 역할
public interface IVistor
{
    public void visit(ConcreteElement1 e1);
    public void visit(ConcreteElement2 e2);
}

2 원소 역할
public abstract class Element
{
    public abstract void accept(IVistor visitor);
    public abstract void doSomething();
}

3. 구체 적 인 방문 자 역할
public class Visitor implements IVistor {
    @Override
    public void visit(ConcreteElement1 e1)
    {
        e1.doSomething();
    }

    @Override
    public void visit(ConcreteElement2 e2)
    {
        e2.doSomething();
    }
}

4 구체 적 인 방문 자 역할
public class ConcreteElement1 extends Element {
    @Override
    public void accept(IVistor visitor)
    {
        visitor.visit(this);
    }

    @Override
    public void doSomething()
    {
        System.out.println("Element1");
    }
}
public class ConcreteElement2 extends Element {
    @Override
    public void accept(IVistor visitor)
    {
        visitor.visit(this);
    }

    @Override
    public void doSomething()
    {
        System.out.println("Element2");
    }
}

5 개체 구조 역할
public class ObjectStructure
{
    public static List<Element> getList()
    {
        List<Element> list = new ArrayList<Element>();
        Random 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());
        }
        return list;
    }
}

6 테스트 코드
        List<Element> list = ObjectStructure.getList();
        for(Element e:list){
            e.accept(new Visitor());
        }

출력 결과: (약)
장단 점 장점 1. 단일 직책 원칙 에 부합 한다. 방문 자 모델 을 적용 하 는 장면 에서 요소 류 에서 방문 자 에 게 봉 해 야 하 는 조작 은 반드시 요소 류 자체 와 관계 가 크 지 않 고 변 하기 쉬 운 조작 이다. 방문 자 모델 을 사용 하 는 것 은 단일 직책 원칙 에 부합 되 고 다른 한편, 봉 인 된 조작 은 흔히 변 하기 쉬 운 것 이기 때문이다.따라서 변화 가 발생 하면 원소 류 자 체 를 바 꾸 지 않 는 전제 에서 변화 부분 에 대한 확장 을 실현 할 수 있다.2. 확장 성 이 좋다: 요소 류 는 서로 다른 방문 자 를 받 아들 여 통 하지 않 는 동작 에 대한 확장 을 실현 할 수 있다.단점: 1. 새로운 원소 류 를 늘 리 기 가 어렵다.방문 자 류 에서 모든 요소 류 는 이에 대응 하 는 처리 방법 이 있다. 즉, 하나의 요소 류 를 추가 할 때마다 방문 자 류 를 수정 해 야 하기 때문에 수정 하기 가 상당히 번거롭다.원소 류 의 수가 불확실 한 상황 에서 방문 자 모드 를 신 중 히 사용 해 야 한 다 는 것 이다.
참고 자료 1. 자바 디자인 모델 13: 방문 자 모드 (Visitor)

좋은 웹페이지 즐겨찾기