디자인 모드 시리즈의 10 교체기 모드

5213 단어
교체기 모드: 집합 대상의 각 요소에 순서대로 접근하고 내부의 표시를 노출하지 않는 방법을 제공합니다.
이런 수요가 있다.한 그룹은 베이징과 상하이에 각각 자회사가 하나 있는데 각 회사 내부에 자신의 부서가 있고 스스로 인쇄 부서의 방법을 제공했다.하위 회사 중 하나는 부서 목록을 배열로 저장하고, 다른 하나는 ArrayList로 저장합니다.현재 모든 부서를 인쇄해야 합니다.

1. 원시적 실현

// 
public class Dept {
    private String name;

    public Dept(String name){
        this.name= name;
    }

    public String getName(){
        return this.name;
    }
}
// 
public class BJBranch {
    ArrayList depts;

    public BJBranch(){
        depts = new ArrayList();
        // 
        depts.add(new Dept(" - "));
        depts.add(new Dept(" - "));
        depts.add(new Dept(" - "));
    }

    public ArrayList getDepts(){
        return depts;
    }
}
// 
public class SHBranch {
    Dept[] depts;

    public SHBranch(){
        depts = new Dept[3];
        // 
        depts[0] = new Dept(" - ");
        depts[1] = new Dept(" - ");
        depts[2] = new Dept(" - ");
    }

    public Dept[] getDepts(){
        return depts;
    }
}
public class TestOld {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        BJBranch BJ             = new BJBranch();
        ArrayList BJDepts = BJ.getDepts();
        SHBranch SH     = new SHBranch();
        Dept[] SHDepts  = SH.getDepts();
        // 
        /**  ,  **/
        for(int i=0;i

위의 코드에서 알 수 있듯이 두 자회사의 실현 방식이 다르기 때문에 순환이 반복되고 대응하는 방식을 사용할 수 있어 상당히 큰 불편을 초래한다.

2. 교체기 모드를 사용하여 문제를 해결한다.

// 
public interface Iterator {
    boolean hasNext();
    Object next();
}
// 
public class BJBranchIterator implements Iterator{
    ArrayList depts;
    int position    = 0;
    public BJBranchIterator(ArrayList depts){
        this.depts = depts;
    }
    @Override
    public boolean hasNext() {
        if(position>=depts.size() || depts.get(position)==null){
            return false;
        }else{
            return true;
        }
    }

    @Override
    public Object next() {
        Dept dept = depts.get(position);
        position  = position + 1;
        return dept;
    }

}

// 
public class BJBranch {
    ArrayList depts;

    public BJBranch(){
        depts = new ArrayList();
        // 
        depts.add(new Dept(" - "));
        depts.add(new Dept(" - "));
        depts.add(new Dept(" - "));
    }

    /*public ArrayList getDepts(){
        return depts;
    }*/

    // Iterator , ArrayList
    public Iterator createrIterator(){
        return new BJBranchIterator(depts);
    }
}
// 
public class SHBranchIterator implements Iterator{
    Dept[] depts;
    int position    = 0;
    public SHBranchIterator(Dept[] depts){
        this.depts = depts;
    }
    @Override
    public boolean hasNext() {
        if(position>=depts.length|| depts[position]==null){
            return false;
        }else{
            return true;
        }
    }

    @Override
    public Object next() {
        Dept dept = depts[position];
        position  = position + 1;
        return dept;
    }

}

// 
public class SHBranch {
    Dept[] depts;

    public SHBranch(){
        depts = new Dept[3];
        // 
        depts[0] = new Dept(" - ");
        depts[1] = new Dept(" - ");
        depts[2] = new Dept(" - ");
    }

    /*public Dept[] getDepts(){
        return depts;
    }*/

    // Iterator , 
    public Iterator createrIterator(){
        return new SHBranchIterator(depts);
    }
}
// 
public class TestNew {

    public static void main(String[] args) {
        Iterator BJ = new BJBranch().createrIterator();
        Iterator SH = new SHBranch().createrIterator();

        printDeptName(BJ);
        printDeptName(SH);
    }

    private static void printDeptName(Iterator iterator){
        while(iterator.hasNext()){
            Dept dept = (Dept) iterator.next();
            System.out.println(dept.getName());
        }
    }
}

개조된 코드에서 알 수 있듯이 교체기 모델을 사용하여 개조한 후에 베이징과 상하이 지사의 범람하는 차이를 성공적으로 차단했다.
자바에서 Iterator를 사용하여 옮겨다니기ArrayList는 대부분이 알고 있을 것이다. 실제로 이Iterator는 교체기 모델의 실현이다.만약 교체기 모드를 사용하지 않는다면 HasTable,HashSet,HashMap 등 유형을 생각해 볼 수 있다. 하나하나가 대응하는 방식으로 순환해야 하기 때문에 상당히 불편하다.
전편: 디자인 모델 시리즈의 9 템플릿 방법 모델 다음 편: 디자인 모델 시리즈의 11 조합 모델

좋은 웹페이지 즐겨찾기