23 가지 디자인 모델 - 방문 자 모델 (CEO, CTO)

2979 단어
정의: 특정한 데이터 구조 에서 각 요소 에 작용 하 는 작업 을 패키지 합 니 다. 이 데이터 구 조 를 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 작업 을 정의 할 수 있 습 니 다.사용 장면: 1. 대상 구조 가 비교적 안정 적 이지 만 이 대상 구조 에서 새로운 조작 을 정의 해 야 한다.2. 한 대상 구조 중의 대상 에 대해 다양한 작업 을 하고 관련 이 없 는 작업 을 해 야 한다. 이런 작업 은 '오염' 대상 의 유형 을 피해 야 하고 새로운 작업 을 추가 할 때 이런 유형 을 수정 하 는 것 을 원 하지 않 는 다.
/**
 *     
 */
public abstract class Staff {
    public String name;
    public int kpi;
    public Staff(String name){
        this.name=name;
        kpi=new Random().nextInt(10);
    }
    //     
    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 interface Visitor {
    //       
    public void visit(Engineer engineer);

    //      
    public void visit(Manager manager);

}

//      
public class BusinessReport {
    List mStaffs = new LinkedList<>();

    public BusinessReport() {
        mStaffs.add(new Manager("   "));
        mStaffs.add(new Engineer("   -Shawn.Xiong"));
        mStaffs.add(new Engineer("   -Kael"));
        mStaffs.add(new Engineer("   -Chaossss"));
        mStaffs.add(new Engineer("   -Tiiime"));
    }

    public void showReport(Visitor visitor) {
        for (Staff staff : mStaffs) {
            staff.accept(visitor);
        }
    }
}

/**
 * CEO   
 */
public class CEOVisitor implements Visitor {
    @Override
    public void visit(Engineer engineer) {
        Log.e("   :" + engineer.name + ",KPI:" + engineer.kpi);
    }

    @Override
    public void visit(Manager manager) {
        Log.e("  :" + manager.name + ",KPI:" + manager.kpi + ",     :" + manager.getProducts());
    }
}

public class CTOVisitor implements Visitor {
    @Override
    public void visit(Engineer engineer) {
        Log.e("   :"+engineer.name+",    :"+engineer.getCodeLines());
    }

    @Override
    public void visit(Manager manager) {
        Log.e("  :"+manager.name+",    :"+manager.getProducts());
    }
}

public class Client {
    public static void main(String[] args) {
        //    
        BusinessReport report = new BusinessReport();
        Log.e("======== CEO    ========");
        report.showReport(new CEOVisitor());
        Log.e("======== CTO    ========");
        report.showReport(new CTOVisitor());
    }
}

좋은 웹페이지 즐겨찾기