zoukankan      html  css  js  c++  java
  • 访问者模式(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);
        }
    
    }
    
    
    • 输出如下:

    以上
    希望对大家有所帮助

  • 相关阅读:
    Mysql面对高并发修改的问题处理【2】
    HSF处理流程分析
    com.jcraft.jsch.JSchException: invalid privatekey
    linux常用命令
    VPS教程:VPS主机能PING通但是SSH无法连接
    Windows 和Linux 不同操作系统的VPS有哪些区别,如何选择?
    Windows VPS有哪些?
    VPS教程:搭建个人云笔记服务器
    VPS搭个人网盘,seafile、kodexplorer、h5ai谁更合适?
    VPS教程:搭建个人网盘—seafile
  • 原文地址:https://www.cnblogs.com/lavender-pansy/p/14361320.html
Copyright © 2011-2022 走看看