JAVA 디자인 모델 의 방문 자 모델 원리 와 용법 에 대한 상세 한 설명

4785 단어
본 고 는 JAVA 디자인 모델 의 방문 자 모델 을 실례 로 서술 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다. 구체 적 으로 는 다음 과 같 습 니 다.
방문 자 모드:
특정한 대상 구조 에서 각 요소 에 작용 하 는 조작 은 각 요소 의 데이터 구 조 를 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 조작 을 증가 시 킬 수 있다.
구조 대상 은 방문 자 모델 에 필수 적 인 조건 이 고 이 구조 대상 은 반드시 자신의 각 대상 을 옮 겨 다 니 는 방법 이 있어 야 한다.
적용: 데이터 구조 가 상대 적 으로 안정 적 이 고 데이터 구조 와 작용 과 그 위의 다른 조작 을 결합 시 켜 조작 을 상대 적 으로 자 유 롭 게 한다.
장점:
1. 단일 직책 원칙 에 부합 되 고 확장 성 이 좋다. 요소 류 는 서로 다른 방문 자 를 받 아들 여 서로 다른 조작 에 대한 확 대 를 실현 할 수 있다.
단점:
1. 새로운 요 소 를 추가 하려 면 조작 을 더욱 복잡 하 게 만 들 수 있다. 2. 일정한 절차 에서 포장 성 원칙 을 파괴 할 수 있다.
방문 자 무기 5 대 캐릭터 대상:
1. Visitor 추상 적 인 방문 자 역할 2. ConcreteVisitor. 구체 적 인 방문 자 역할 3. Element 수용 방문 조작 요소 4. ConcreteElement 구체 적 인 요소 5. Object Structure 구조 대상 역할, 이것 은 방문 자 모델 을 사용 하 는 데 필수 적 인 역할 이다.

/**
 *      :                       。
 *                                  ,
 *                          。
 * @description:
 * @date 2016-1-15   4:00:29
 */
public interface Visitor {
  void visit(Element element);
}


/**
 *        ,  Visitor     。
 * @description:
 * @date 2016-1-15   4:20:46
 */
public class ConcreteVisitor implements Visitor{
  @Override
  public void visit(Element element) {
    Staff e=(Staff) element;
    //  :       :  *    +  *         10        
    System.out.println(e.getName()+"      :"+(e.getDegree()*0.8+e.getWorkAges()*0.5)/10*e.getSalary());//
  }
}


/**
 *            ,   (Visitor)       。
 * @description:
 * @date 2016-1-15   3:58:28
 */
public abstract class Element {
  public abstract void Acceppt(Visitor visitor);
}


/**
 *     ,       (Element)          。
 * @description:
 * @date 2016-1-15   4:04:24
 */
public class Staff extends Element {
  private String name;
  private float salary;
  private int workAges;
  private int degree;
  public Staff(String name, float salary, int workAges, int degree) {
    super();
    this.name = name;
    this.salary = salary;
    this.workAges = workAges;
    this.degree = degree;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public float getSalary() {
    return salary;
  }
  public void setSalary(float salary) {
    this.salary = salary;
  }
  public int getWorkAges() {
    return workAges;
  }
  public void setWorkAges(int workAges) {
    this.workAges = workAges;
  }
  public int getDegree() {
    return degree;
  }
  public void setDegree(int degree) {
    this.degree = degree;
  }
  @Override
  public void Acceppt(Visitor visitor) {
    visitor.visit(this);
  }
}


/**
 *     :              。
 *        :
 *        ;
 *                       ;
 *     ,                 (          )。
 * @description:
 * @date 2016-1-15   4:26:30
 */
public class StaffObject {
  private HashMap employees;
  public StaffObject() {
    employees = new HashMap();
  }
  public void addEmployee(Staff e) {
    if (!employees.containsKey(e.getName())) {
      employees.put(e.getName(), e);
    }
  }
  public void removeEmployee(Staff e) {
    if (employees.containsKey(e.getName())) {
      employees.remove(e);
    }
  }
  public Staff getEmployee(String name) {
    return employees.get(name);
  }
  public void Accept(Visitor v) {
    for (Staff e : employees.values()) {
      e.Acceppt(v);
    }
  }
}


테스트 클래스

public class Test {
  public static void main(String[] args) {
    StaffObject e=new StaffObject();
    e.addEmployee(new Staff("  ", 3000f, 2, 1));
    e.addEmployee(new Staff("  ", 5000f, 4, 2));
    e.addEmployee(new Staff("  ", 8000f, 6, 3));
    e.addEmployee(new Staff("  ", 10000f, 9, 4));
    e.Accept(new ConcreteVisitor());
  }
}


실행 결과:

        :1800.0
        :540.0
        :7700.0
        :4320.0


더 많은 자바 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.,,,,,,
본 고 에서 말 한 것 이 여러분 의 자바 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기