访问者模式(Visitor)_java实现

// 20210202
写在前面:刚期末考试完,考了面向对象,里边儿有23个设计模式,我寻思着考完挨个儿实现一下,本文实现访问者模式

访问者模式核心思想

  • 网上找的帖子都说访问者模式是最复杂的一个模式,但是看完懂了之后感觉也没有多复杂,但是模式之中的成分关系比较抽象
  • 总的来说,核心思想就是让数据结构和数据操作分离,数据结构(被访问者)不变,被访问者每次被访问都作出一个相同的动作,但是每个访问者由于水平不同,对一个相同的访问者可能出现不同的反应,所以再不用更改被访问者代码的情况下,可以增加访问者以增加被访问者没有的操作————通俗点就是见人说人话,见鬼说鬼话
  • 上面说的很抽象,下面上张图(被访问者A、B可不做任何事)

程序源代码

  • 此处使用男人和女人做被访问类,人就分男人女人,很稳定,符合被访问者角色的定义,然后失败和成功分别访问男人和女人
/**
 * 访问者父类
 */
public abstract class Action {
    //得到男人的结论或反应
    public abstract void getManConclusion(Man man);

    //得到女人的结论或反应
    public abstract void getWomanConclusion(Women woman);
}

/**
 * 被访问者父类——人类
 */
public abstract class Person {
    //接受
    public abstract void accept(Action action);
}

/**
 * 关系承载者
 */

import java.util.LinkedList;
import java.util.List;

public class ObjectStructure {

    private List<Person> elements = new LinkedList<>();

    //增加
    public void attach(Person person){
        elements.add(person);
    }

    //移除
    public void detach(Person person){
        elements.remove(person);
    }

    //查看显示
    public void display(Action action) {
        for(Person person:elements) {
            person.accept(action);
        }
    }
}

/**
 * 访问者——失败类
 */
public class Failing extends Action{
    @Override
    public void getManConclusion(Man man) {
        System.out.println("男人失败...");
    }

    @Override
    public void getWomanConclusion(Women woman) {
        System.out.println("女人失败...");
    }
}

/**
 * 访问者——成功类
 */
public class Success extends Action{
    @Override
    public void getManConclusion(Man man) {
        System.out.println("男人成功...");
    }

    @Override
    public void getWomanConclusion(Women woman) {
        System.out.println("女人成功...");
    }
}

/**
 * 被访问者——男人
 */
public class Man extends Person{
    @Override
    public void accept(Action action) {
        action.getManConclusion(this);
    }
}
/**
 * 被访问者——女人
 */
public class Women extends Person{
    @Override
    public void accept(Action action) {
        action.getWomanConclusion(this);
    }
}

/**
 * 测试主类
 */
public class Main {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();

        objectStructure.attach(new Man());
        objectStructure.attach(new Women());

        //成功
        Success success = new Success();
        objectStructure.display(success);

        Failing failing = new Failing();
        objectStructure.display(failing);
    }

}

  • 输出如下:

以上
希望对大家有所帮助

posted @ 2021-02-02 12:30  醉生梦死_0423  阅读(153)  评论(0编辑  收藏  举报