디자인 모드 - 행동 형 방문 자 (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) 의 대상 을 포함 하고 이런 대상 에 대해 구체 적 인 유형 에 의존 하 는 조작 을 실시 하고 자 합 니 다.서로 다른 유형의 대상 은 서로 다른 접근 조작 을 할 수 있다.한 대상 구조 에 있 는 대상 에 대해 다양한 작업 을 하고 관련 이 없 는 작업 을 해 야 하 며 이러한 작업 이 '오염' 되 는 대상 의 유형 을 피해 야 하 며 새로운 작업 을 추가 할 때 이런 유형 을 수정 하 는 것 도 원 하지 않 는 다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java_command_매크로 명령introduction: 이렇게 하는 목적은'하드 인코딩'을 줄이고 명령의 조합을 동태적으로 결정하여 사용에 더욱 유연하게 할 수 있다. 일반적으로 매크로 명령의 방법은 더욱 우아하고 비교적 적은 새로운 코드가 필요...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.