横たわるデザインパターンのノート(XXV)のVisitorパターン

Visitorパターン

定義

これは、オブジェクト構造の効果の各要素の動作を表します。それはあなたがこれらの新しい要素の動作に作用する各要素の前提の下で、クラスの定義を変更することはできませんになります。

UML图

機能

  • ビジターパターンは、データ構造に適用される動作データとの間のカップリングこと、操作が比較的自由に進化に設定することができるように、解放されるべき構造体に作用する、比較的安定したシステムであります
  • 目的は、ビジターパターン処理データ構造から分離されています
  • そこデータ構造アルゴリズムは比較的安定であり、かつ容易に変更し、次に使用する場合ので、動作アルゴリズムを高めるためにビジターパターンが容易になることであるため、ビジターパターンが、より適切です
  • Visitorパターンは、新しいオペレーションの優位性を高めることである、それは新しい操作を追加すると、新規訪問者を追加して意味するので、非常に簡単です。ビジター対象物の濃度に関連した行動のビジターパターン
  • 欠点は事実であり、新しいデータ構造を追加するために訪問者が困難になります。

栗のために

男性と女性に分け人々は、それぞれ、愛のさまざまな理由のための彼/彼女の成功、失敗を、説明します。

UML图

話は安いです、私のコードを表示します

(くそ以下、アップグレーディング)

/**
 * 状态
 * Created by callmeDevil on 2019/12/22.
 */
public abstract class Action {
    // 得到男人结论或反应
    public abstract void getManConclusion(Man concreteElementA);
    // 得到女人结论或反应
    public abstract void getWomanConclusion(Woman concreteElementB);
}
/**
 * 成功
 * Created by callmeDevil on 2019/12/22.
 */
public class Success extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(String.format("%s %s时,背后多半有一个伟大的女人。",
                concreteElementA.getClass().getSimpleName(), this.getClass().getSimpleName()));
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(String.format("%s %s时,背后多半有一个不成功的男人。",
                concreteElementB.getClass().getSimpleName(), this.getClass().getSimpleName()));
    }

}
/**
 * 失败
 * Created by callmeDevil on 2019/12/22.
 */
public class Failing extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(String.format("%s %s时,背后多半有一个不伟大的女人。",
                concreteElementA.getClass().getSimpleName(), this.getClass().getSimpleName()));
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(String.format("%s %s时,背后多半有一个成功的男人。",
                concreteElementB.getClass().getSimpleName(), this.getClass().getSimpleName()));
    }

}
/**
 * 恋爱
 * Created by callmeDevil on 2019/12/22.
 */
public class Amativeness extends Action {

    @Override
    public void getManConclusion(Man concreteElementA) {
        System.out.println(String.format("%s %s时,背后多半是个高富帅。",
                concreteElementA.getClass().getSimpleName(), this.getClass().getSimpleName()));
    }

    @Override
    public void getWomanConclusion(Woman concreteElementB) {
        System.out.println(String.format("%s %s时,背后多半是个会打扮。",
                concreteElementB.getClass().getSimpleName(), this.getClass().getSimpleName()));
    }

}
/**
 * 人
 * Created by callmeDevil on 2019/12/22.
 */
public abstract class Person {
    // 接受
    public abstract void accept(Action visitor);
}
/**
 * 男人
 * Created by callmeDevil on 2019/12/22.
 */
public class Man extends Person{
    @Override
    public void accept(Action visitor) {
        // 首先在客户端程序中将具体状态作为参数传递给“男人”类完成了一次分派,然后“男人”类调用
        // 作为参数的“具体状态”中的方法“男人反应”,同时将自己(this)作为参数传递进去,这便完成
        // 了第二次分派。这种技术手段称为“双分派”。
        visitor.getManConclusion(this);
    }
}
/**
 * 女人
 * Created by callmeDevil on 2019/12/22.
 */
public class Woman extends Person{
    @Override
    public void accept(Action visitor) {
        visitor.getWomanConclusion(this);
    }
}
/**
 * 对象结构
 * Created by callmeDevil on 2019/12/22.
 */
public class ObjectStructure {

    private List<Person> 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 element : elements) {
            element.accept(visitor);
        }
    }

}
public class Test {
    public static void main(String[] args) {
        ObjectStructure obj = new ObjectStructure();
        // 对象结构中加入要对比的男人和女人
        obj.attach(new Man());
        obj.attach(new Woman());

        // 成功的反应
        Success success = new Success();
        obj.display(success);

        // 失败的反应
        Failing failing = new Failing();
        obj.display(failing);

        // 恋爱的反应
        Amativeness amativeness = new Amativeness();
        obj.display(amativeness);
    }
}

業績

Man Success时,背后多半有一个伟大的女人。
Woman Success时,背后多半有一个不成功的男人。
Man Failing时,背后多半有一个不伟大的女人。
Woman Failing时,背后多半有一个成功的男人。
Man Amativeness时,背后多半是个高富帅。
Woman Amativeness时,背后多半是个会打扮。

おすすめ

転載: www.cnblogs.com/call-me-devil/p/12079781.html