디자인 모드 - 행동 형 방문 자 (Visitor) 모드

정의.
4. 567917. 데이터 구조 와 데이터 구조 에 대한 조작 을 분리 한다
필드 사용
4. 567917. 안정 적 인 데이터 구조 와 변 하기 쉬 운 조작 결합 문제
4. 567917. 한 대상 구조 중의 대상 에 대해 서로 다 르 고 관련 이 없 는 조작 을 해 야 한다. 이런 조작 '오염' 대상 의 유형 을 피해 야 하고 새로운 조작 을 추가 할 때 이런 유형 을 수정 하 는 것 을 원 하지 않 는 다
UML 그림
코드 구현
코드 원본:https://www.jianshu.com/p/1f1049d0a0f4 연말 에 CEO 와 CTO 는 직원 들 의 1 년 업무 실적 을 평가 하기 시 작 했 고 직원 들 은 엔지니어 와 매니저 로 나 뉘 었 으 며 CTO 는 엔지니어 의 코드 량, 매니저 의 신제품 수량 에 관심 을 가 졌 다.CEO 가 주목 하 는 것 은 엔지니어 의 KPI 와 매니저 의 KPI, 그리고 신제품 수량 이다.CEO 와 CTO 의 직원 별 관심 사가 다 르 기 때문에 직원 유형 에 따라 다 르 게 처리 해 야 한다.방문 자 모드 는 이때 도움 이 될 수 있다.
//     
public abstract class Staff {
     

    public String name;
    public int kpi;//   KPI

    public Staff(String name) {
     
        this.name = name;
        kpi = new Random().nextInt(10);
    }
    //     ,  Visitor   
    public abstract void accept(Visitor visitor);
}
//    
public class Engineer extends Staff {
     

    public Engineer(String name) {
     
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
     
        visitor.visit(this);
    }
    //           
    public int getCodeLines() {
     
        return new Random().nextInt(10 * 10000);
    }
}
//   
public class Manager extends Staff {
     

    public Manager(String name) {
     
        super(name);
    }

    @Override
    public void accept(Visitor visitor) {
     
        visitor.visit(this);
    }
    //         
    public int getProducts() {
     
        return new Random().nextInt(10);
    }
}
//        (    )
public class BusinessReport {
     

    private List<Staff> mStaffs = new LinkedList<>();

    public BusinessReport() {
     
        mStaffs.add(new Manager("  -A"));
        mStaffs.add(new Engineer("   -A"));
        mStaffs.add(new Engineer("   -B"));
        mStaffs.add(new Engineer("   -C"));
        mStaffs.add(new Manager("  -B"));
        mStaffs.add(new Engineer("   -D"));
    }

    /**
     *         
     * @param visitor     , CEO、CTO
     */
    public void showReport(Visitor visitor) {
     
        for (Staff staff : mStaffs) {
     
            staff.accept(visitor);
        }
    }
}
public interface Visitor {
     

    //        
    void visit(Engineer engineer);

    //       
    void visit(Manager manager);
}
// CEO   
public class CEOVisitor implements Visitor {
     
    @Override
    public void visit(Engineer engineer) {
     
        System.out.println("   : " + engineer.name + ", KPI: " + engineer.kpi);
    }

    @Override
    public void visit(Manager manager) {
     
        System.out.println("  : " + manager.name + ", KPI: " + manager.kpi +
                ",      : " + manager.getProducts());
    }
}
// CTO   
public class CTOVisitor implements Visitor {
     
    @Override
    public void visit(Engineer engineer) {
     
        System.out.println("   : " + engineer.name + ",     : " + engineer.getCodeLines());
    }

    @Override
    public void visit(Manager manager) {
     
        System.out.println("  : " + manager.name + ",     : " + manager.getProducts());
    }
}

총결산
4. 567917. 안정 적 인 데이터 구조 와 변 하기 쉬 운 조작 결합 문제;대상 자체 와 대상 의 접근 동작 을 분리 합 니 다
장점: - 단일 직책 원칙 에 부합.우수한 확장 성, 유연성
단점: - 구체 적 인 요 소 는 방문 자 에 게 세부 사항 을 발표 하고 디 미트 원칙 을 위반 했다.의존 도치 원칙 을 위반 하고 구체 적 인 유형 에 의존 하 며 추상 에 의존 하지 않 았 다
4. 567917. 사용 장면: - 하나의 대상 구조 (Business Report) 는 여러 가지 유형 (manager, Engineer) 의 대상 을 포함 하고 이런 대상 에 대해 구체 적 인 유형 에 의존 하 는 조작 을 실시 하고 자 합 니 다.서로 다른 유형의 대상 은 서로 다른 접근 조작 을 할 수 있다.한 대상 구조 에 있 는 대상 에 대해 다양한 작업 을 하고 관련 이 없 는 작업 을 해 야 하 며 이러한 작업 이 '오염' 되 는 대상 의 유형 을 피해 야 하 며 새로운 작업 을 추가 할 때 이런 유형 을 수정 하 는 것 도 원 하지 않 는 다

좋은 웹페이지 즐겨찾기