24-访问者模式

24-访问者模式

概念

访问者模式(visitor),表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的前提下定义作用于这些元素的新操作
访问者模式适用于数据结构相对稳定的系统,它把数据结构和作用域结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化
访问者模式的目的是要把处理从数据结构分离出来,系统有比较稳定的数据结构,又有容易变化的算法的话,使用访问者模式就是边角合适的,因为访问者模式使得算法操作的增加变得容易
访问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关行为集中到一个访问者对象中。

实践

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public abstract class Person {
    public abstract void accept(Action visitor);
}

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class Woman extends Person {
    @Override
    public void accept(Action visitor) {
        visitor.getWomanConclusion(this);
    }
}

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class Man extends Person {
    @Override
    public void accept(Action visitor) {
        visitor.getManConclusion(this);
    }
}

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public abstract class Action {
    public abstract void getManConclusion(Man man);

    public abstract void getWomanConclusion(Woman woman);
}

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class Failing extends Action {

    @Override
    public void getManConclusion(Man man) {
        System.out.println(man.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,闷头喝酒,谁也不用劝。");
    }

    @Override
    public void getWomanConclusion(Woman woman) {
        System.out.println(woman.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,眼泪汪汪,谁也劝不了。");
    }
}

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class Success extends Action {

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

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

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class Love extends Action {

    @Override
    public void getManConclusion(Man man) {
        System.out.println(man.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,凡事不懂也要装懂。");
    }

    @Override
    public void getWomanConclusion(Woman woman) {
        System.out.println(woman.getClass().getSimpleName() + " " + getClass().getSimpleName() + "时,遇事懂也装不懂。");
    }
}

package com.gof.visitor;

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

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class ObjectStructure {
    private List<Person> elements = new ArrayList<>();

    public void add(Person person) {
        elements.add(person);
    }

    public void remove(Person person) {
        elements.remove(person);
    }

    public void display(Action visiter) {
        for (Person per : elements) {
            per.accept(visiter);
        }
    }
}

package com.gof.visitor;

/**
 * 功能描述
 *
 * @since 2023-03-11
 */
public class Client {
    public static void main(String[] args) {
        Success success = new Success();
        Failing failing = new Failing();
        Love love = new Love();
        Man man = new Man();
        Woman woman = new Woman();
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(man);
        objectStructure.add(woman);

        objectStructure.display(love);
        objectStructure.display(failing);
        objectStructure.display(success);
    }
}

posted @ 2023-03-11 15:15  Oh,mydream!  阅读(8)  评论(0编辑  收藏  举报