ホームページ  >  記事  >  Java  >  Java ビジター パターンを使用してオブジェクト構造を美しい方法で処理する方法

Java ビジター パターンを使用してオブジェクト構造を美しい方法で処理する方法

WBOY
WBOY転載
2023-05-09 16:01:171504ブラウズ

はじめに

Java ビジター パターン (ビジター パターン) は、動作するオブジェクトからアルゴリズムを分離できるようにする動作設計パターンです。このパターンは、さまざまなタイプのオブジェクトにアクセスできるビジター オブジェクトを定義し、一部の操作を実行するだけでなく、既存のコードを変更せずに新しい操作を追加することもできます。

訪問者パターンには、訪問者と要素という 2 つの重要な役割があります。要素は、オブジェクト構造のコンポーネントです。ビジターは、実行される操作を表すオブジェクトです。ビジターは、要素の accept メソッドを通じて要素にアクセスできます。

Java ビジター パターンには、通常、次の 5 つのタイプが含まれます。 役割:

  • Abstract Visitor: 各要素にアクセスできるアクセス メソッドを定義します。

  • Concrete Visitor ): さまざまな要素に対する特定の操作を含む、抽象ビジターによって定義されたアクセス メソッドを実装します。

  • 抽象要素 (要素): アクセスを有効にするために訪問者オブジェクトを受け入れるメソッドを定義します。訪問者は自分自身にアクセスできます。

  • 具体要素: 訪問者を実装します。

  • オブジェクト構造: 要素を横断する反復子を提供し、訪問者からのアクセスを受け入れることができる要素を含むコレクション。

実装

動物園には、犬、猫、鳥など、さまざまな種類の動物がいます。訪問者モードを使用して、さまざまな種類の動物の数を数えることができます

抽象要素

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 ビジター パターンを使用してオブジェクト構造を美しい方法で処理する方法

この例では、Dog、Cat、Bird を含む 3 つの動物クラスを定義しました。これらはすべて Animal インターフェイスを実装しており、accept メソッドを持っています。このメソッドは Visitor タイプ パラメータを渡します。

次に、Visitor インターフェイスが定義されます。これには、渡されたさまざまな種類の動物に応じてアクセスする Visitor メソッドが含まれています。 Visitor の特定の実装では、AnimalCountVisitor と AnimalFeatureVisitor という 2 つの訪問者が定義されています。前者はさまざまな種類の動物の数を数えるために使用され、後者はさまざまな種類の動物の属性を出力するために使用されます。概要

利点

アルゴリズムとオブジェクトの分離: 訪問者パターンにより、アルゴリズムとオブジェクトを分離できます。これは、アルゴリズムが訪問者で定義され、オブジェクトが公開するためです。

  • 優れたスケーラビリティ: ビジター モードはオブジェクト構造をオブジェクト構造から分離するため、このモードでは既存のオブジェクト構造に影響を与えることなく、新しい操作を簡単に追加できます。 Operation.

  • オープンクローズ原則に準拠: 既存のコードを変更せずに新しい訪問者と新しい要素タイプを追加できるため、訪問者パターンはオープンクローズ原則に準拠しています。

  • コード ロジックの簡素化: 訪問者パターンによりオブジェクトと操作が分離され、コード ロジックが簡素化されます。

  • 欠点

#新しい要素タイプを追加するのは難しい : 新しい要素タイプを追加する必要がある場合、既存の訪問者インターフェイスを変更する必要があり、これにより既存のコードの変更が必要になる可能性があります。カプセル化の破壊: 訪問者パターンでは、オブジェクトが次の状態である必要があります。内部データが訪問者に公開されるため、オブジェクトのカプセル化が破壊される可能性があります。

  • #アプリケーション シナリオ

  • 複雑なオブジェクト構造を必要とする場合 内部実装を公開せずに操作を実行する場合は、訪問者パターンを使用できます。

新しい操作を追加する必要がある場合クラス階層に影響を与えることなく、オブジェクト構造内の各オブジェクトを作成する オブジェクトのクラス階層が変更されても、その操作が比較的安定している場合、ビジター パターンを使用できます。

  • 動的に決定する必要がある場合実行時に実行される操作には、訪問者パターンを使用できます。

以上がJava ビジター パターンを使用してオブジェクト構造を美しい方法で処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。