>  기사  >  Java  >  Java 방문자 패턴을 사용하여 객체 구조를 아름답게 처리하는 방법

Java 방문자 패턴을 사용하여 객체 구조를 아름답게 처리하는 방법

WBOY
WBOY앞으로
2023-05-09 16:01:171513검색

소개

Java 방문자 패턴은 알고리즘이 작동하는 개체와 분리할 수 있게 해주는 동작 설계 패턴입니다. 이 패턴은 다양한 유형의 개체에 액세스하고 일부 작업을 수행할 수 있는 방문자 개체를 정의할 뿐만 아니라 새로운 개체를 추가할 수도 있습니다.

방문자 패턴에는 방문자와 요소라는 두 가지 중요한 역할이 있습니다. 요소는 개체 구조의 구성 요소입니다. 방문자는 수행할 작업을 나타내는 개체입니다.

Java 방문자 패턴에는 일반적으로 다음 5가지 역할이 포함됩니다.

  • Abstract Visitor(Visitor): 정의 각 요소에 액세스할 수 있는 액세스 방법

  • Concrete Visitor: 정의된 액세스 방법을 구현합니다.

  • Abstract 요소(Element): 방문자가 자체적으로 액세스할 수 있도록 방문자 개체를 허용하는 방법을 정의합니다.

  • Concrete Element): 구현합니다. 방문자가 자체에 액세스할 수 있도록 추상 요소에 의해 정의된 수락자 메서드

  • 개체 구조: 요소를 순회하는 반복자를 제공할 수 있고 방문자의 액세스를 허용할 수 있는 컬렉션입니다.

  • 동물원에는 개, 고양이, 새 등 다양한 종류의 동물이 있습니다. 방문 방문객 모드를 사용하면 다양한 종류의 동물 수와 다양한 동물의 속성 정보를 계산할 수 있습니다. 추상 요소
public interface Animal {
    void accept(Visitor visitor);
}

콘크리트 요소

@Data
public class Bird implements Animal{
    private String name;
    private String habitat;
    public Bird(String name, String habitat) {
        this.name = name;
        this.habitat = habitat;
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }
}
@Data
public class Cat implements Animal{
    private String sound;
    private int age;
    public Cat(String sound, int age) {
        this.sound = sound;
        this.age = age;
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }
}
@Data
public class Dog implements Animal{
    private String color;
    private int size;
    public Dog(String color, int size) {
        this.color = color;
        this.size = size;
    }
    @Override
    public void accept(Visitor visitor) {
        visitor.visitor(this);
    }
}

추상 방문자

public interface Visitor {
    void visitor(Dog dog);
    void visitor(Cat cat);
    void visitor(Bird bird);
}

콘크리트 방문자

public class AnimalCountVisitor implements Visitor{
    private int dogCount;
    private int birdCount;
    private int catCount;
    @Override
    public void visitor(Dog dog) {
        dogCount++;
    }
    @Override
    public void visitor(Cat cat) {
        catCount++;
    }
    @Override
    public void visitor(Bird bird) {
        birdCount++;
    }
    public void printCount(){
        System.out.println("狗的个数:"+dogCount);
        System.out.println("猫的个数:"+catCount);
        System.out.println("鸟的个数:"+birdCount);
    }
}
public class AnimalFeatureVisitor implements Visitor {
    private List<String> features;
    public AnimalFeatureVisitor() {
        features = new ArrayList<>();
    }
    @Override
    public void visitor(Dog dog) {
        features.add("Dog:color=" + dog.getColor() + ",size=" + dog.getSize());
    }
    @Override
    public void visitor(Cat cat) {
        features.add("Car:sound=" + cat.getSound() + ",age=" + cat.getAge());
    }
    @Override
    public void visitor(Bird bird) {
        features.add("Bird:name=" + bird.getName() + ",habitat=" + bird.getHabitat());
    }
    public void printFeatures(){
        features.forEach(System.out::println);
    }
}

Test

public class Demo {
    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        animals.add(new Dog("褐色", 50));
        animals.add(new Dog("白色", 45));
        animals.add(new Cat("喵喵叫", 2));
        animals.add(new Cat("呜呜声", 3));
        animals.add(new Bird("鹦鹉", "森林"));
        animals.add(new Bird("麻雀", "田野"));
        AnimalCountVisitor animalCountVisitor = new AnimalCountVisitor();
        AnimalFeatureVisitor animalFeatureVisitor = new AnimalFeatureVisitor();
        animals.forEach(animal -> {
            animal.accept(animalCountVisitor);
            animal.accept(animalFeatureVisitor);
        });
        animalCountVisitor.printCount();
        animalFeatureVisitor.printFeatures();
    }
}

이 예에서는 개, 고양이, 새를 포함한 세 가지 동물 클래스를 정의했습니다. 인터페이스에는 방문자 유형 매개변수를 전달하는 승인 메소드가 있습니다.

다음으로, 전달된 다양한 유형의 동물에 따라 액세스하는 방문자 메소드가 포함된 방문자 인터페이스가 정의됩니다.

Java 방문자 패턴을 사용하여 객체 구조를 아름답게 처리하는 방법의 특정 구현에서 Visitor, AnimalCountVisitor 및 AnimalFeatureVisitor가 정의되어 있습니다. 전자는 다양한 유형의 동물 수를 계산하는 데 사용되고 후자는 다양한 유형의 동물의 속성을 인쇄하는 데 사용됩니다.

알고리즘과 객체의 분리: 방문자 패턴을 사용하면 알고리즘이 방문자에서 정의되고 객체에 액세스할 때 자체 데이터가 방문자에게 노출되므로 알고리즘과 객체를 분리할 수 있습니다. 접근이 객체 구조와 연산을 분리하기 때문에 기존 객체 구조에 영향을 주지 않고 새로운 연산을 쉽게 추가할 수 있습니다.

개방형 원칙을 준수합니다. 방문자 패턴은 새로운 객체를 추가할 수 있기 때문에 개방형 폐쇄형 원칙을 따릅니다. 기존 코드를 변경하지 않고도 방문자와 새 요소 유형을 변경할 수 있습니다.

코드 논리 단순화: 방문자 패턴은 개체와 작업을 분리하여 코드 논리를 단순화합니다.

  • 단점

  • 새 요소 유형 추가의 어려움: 필요한 경우 새로운 요소 유형 추가, 기존 방문자 인터페이스를 수정해야 하며 이로 인해 기존 코드가 수정될 수 있습니다.

  • 캡슐화 중단: 방문자 패턴에서는 객체의 내부 데이터를 방문자에게 노출해야 하므로 객체의 캡슐화가 파괴될 수 있습니다.

  • 애플리케이션 시나리오

내부 구현을 노출하지 않고 복잡한 객체 구조를 운영해야 하는 경우 방문자 패턴을 사용할 수 있습니다.

  • 객체 구조 방문자 패턴은 객체의 클래스 계층 구조가 변경되지만 해당 작업이 상대적으로 안정적으로 유지될 때 사용할 수 있습니다. 방문자 패턴은 런타임에 수행할 작업을 동적으로 결정할 때 사용할 수 있습니다.

위 내용은 Java 방문자 패턴을 사용하여 객체 구조를 아름답게 처리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제