큰소리 디자인 모델 의 방문 자 모델 총화 - 자바 실현

17495 단어 디자인 모드
주의: 예 시 는 에서 나 왔 습 니 다.
다음 코드 가 있다 면
package Test28;

public class Program {

    public static void main(String[] args) {

        System.out.println("     ,            。");
        System.out.println("     ,             。");
        System.out.println("     ,    ,     。");
        System.out.println("     ,    ,     。");
        System.out.println("     ,        。");
        System.out.println("     ,        。");

    }

}

다음은 대상 을 대상 으로 재 구성 코드 를 사용 하여 다음 과 같이 실현 합 니 다.
인류의
package Test28;

// 
public abstract class Person {

    protected String action;

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    //       
    public abstract void GetConclusion();

}

남자
package Test28;

//  
public class Man extends Person {

    //       
    @Override
    public void GetConclusion() {
        if (action == "  ")
        {
            System.out.println(this.getClass().getSimpleName()+action+" ,            。");
        }
        else if (action == "  ")
        {
            System.out.println(this.getClass().getSimpleName()+action+" ,    ,     。");
        }
        else if (action == "  ")
        {
            System.out.println(this.getClass().getSimpleName()+action+" ,        。");
        }

    }

}

여자
package Test28;

//  
public class Woman extends Person {

    //       
    @Override
    public void GetConclusion() {
        if (action == "  ")
        {
            System.out.println(this.getClass().getSimpleName()+action+" ,             。");
        }
        else if (action == "  ")
        {
            System.out.println(this.getClass().getSimpleName()+action+" ,    ,     。");
        }
        else if (action == "  ")
        {
            System.out.println(this.getClass().getSimpleName()+action+" ,        。");
        }

    }

}

클 라 이언 트 코드
    package Test28;

import java.util.ArrayList;
import java.util.List;

    public class Program {

        public static void main(String[] args) {

            List persons = new ArrayList();

            Person man1 = new Man();
            man1.setAction("  ");
            persons.add(man1);
            Person woman1 = new Woman();
            woman1.setAction("  ");
            persons.add(woman1);

            Person man2 = new Man();
            man2.setAction("  ");
            persons.add(man2);
            Person woman2 = new Woman();
            woman2.setAction("  ");
            persons.add(woman2);

            Person man3 = new Man();
            man3.setAction("  ");
            persons.add(man3);
            Person woman3 = new Woman();
            woman3.setAction("  ");
            persons.add(woman3);

            for (Person item : persons)
            {
                item.GetConclusion();
            }

        }

    }

위의 표기 법 은 남자 류 와 여자 류 중 if else 가 너무 많 습 니 다. 그리고 지금 결혼 상 태 를 추가 하려 면 두 가지 모두 분기 판단 을 추가 해 야 합 니 다. 다음은 방문 자 모델 로 재 구성 코드 는 다음 과 같 습 니 다.
상태의 추상 류 와 사람의 추상 류
package Test28;

//  
public abstract class Action {

    //         
    public abstract void GetManConclusion(Man concreteElementA);
    //         
    public abstract void GetWomanConclusion(Woman concreteElementB);

}
package Test28;

// 
public abstract class Person {

    //  
    public abstract void Accept(Action visitor);

}

구체 적 상태 클래스
package Test28;

//  
public class Success extends Action {

    @Override
    public void GetManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,            。");

    }

    @Override
    public void GetWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,             。");

    }

}
package Test28;

//  
public class Failing extends Action {

    @Override
    public void GetManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,    ,     。");

    }

    @Override
    public void GetWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,    ,     。");

    }

}
package Test28;

//  
public class Amativeness extends Action {

    @Override
    public void GetManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,        。");

    }

    @Override
    public void GetWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,        。");

    }

}
package Test28;

//  
public class Marriage extends Action {

    @Override
    public void GetManConclusion(Man concreteElementA) {
        System.out.println(concreteElementA.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,   :       ,‘    ’   。");

    }

    @Override
    public void GetWomanConclusion(Woman concreteElementB) {
        System.out.println(concreteElementB.getClass().getSimpleName()+this.getClass().getSimpleName()+" ,   :       ,       。");

    }

}

남자 류 와 여자 류
package Test28;

//  
public class Man extends Person {

    @Override
    public void Accept(Action visitor) {
        visitor.GetManConclusion(this);

    }

}
package Test28;

//  
public class Woman extends Person {

    @Override
    public void Accept(Action visitor) {
        visitor.GetWomanConclusion(this);

    }

}

대상 구조 류
package Test28;

import java.util.ArrayList;
import java.util.List;

//    
public class ObjectStructure {

    private List elements = new ArrayList();

    //  
    public void Attach(Person element)
    {
        elements.add(element);
    }
    //  
    public void Detach(Person element)
    {
        elements.remove(element);
    }
    //    
    public void Display(Action visitor)
    {
        for (Person e : elements)
        {
            e.Accept(visitor);
        }
    }

}

클 라 이언 트 코드
    package Test28;

    public class Program {

        public static void main(String[] args) {

            ObjectStructure o = new ObjectStructure();
            o.Attach(new Man());
            o.Attach(new Woman());

            Success v1 = new Success();
            o.Display(v1);

            Failing v2 = new Failing();
            o.Display(v2);

            Amativeness v3 = new Amativeness();
            o.Display(v3);

            Marriage v4 = new Marriage();
            o.Display(v4);

        }

    }

방문 자 모드 는 특정한 대상 구조 에 작용 하 는 각 요소 의 조작 을 나타 내 므 로 각 요소 의 유형 을 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 조작 을 정의 할 수 있 습 니 다.
방문 자 모델 은 데이터 구조 가 상대 적 으로 안정 적 인 시스템 에 적용 되 고 데이터 구조 와 구조 에 작용 하 는 조작 간 의 결합 을 해제 하여 조작 집합 을 상대 적 으로 자 유 롭 게 진화 시 킬 수 있다.
방문 자 모드 의 목적 은 데이터 구조 에서 처 리 를 분리 하 는 것 입 니 다. 많은 시스템 이 알고리즘 과 데이터 구조 에 따라 분 리 될 수 있 습 니 다. 만약 에 이런 시스템 이 비교적 안정 적 인 데이터 구조 와 변화 하기 쉬 운 알고리즘 이 있다 면 방문 자 모드 를 사용 하 는 것 이 적당 합 니 다. 방문 자 모드 로 인해 알고리즘 작업 의 증가 가 쉬 워 집 니 다.구조 대상 은 변화 하기 쉬 우 며 새로운 데이터 대상 이 늘 어 나 면 방문 자 모드 를 사용 하기에 적합 하지 않다.
방문 자 모델 의 장점 은 새로운 조작 을 추가 하 는 것 이 쉽다 는 것 이다. 왜냐하면 새로운 조작 을 추가 하 는 것 은 새로운 방문 자 방문 자 모델 을 추가 하여 관련 행 위 를 한 방문 자 대상 에 집중 시 키 는 것 을 의미 하기 때문이다.
단점 은 새로운 데이터 구 조 를 늘 리 는 것 을 어렵 게 만 드 는 것 이다.

좋은 웹페이지 즐겨찾기