Visitor Pattern

这篇具有很好参考价值的文章主要介绍了Visitor Pattern。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

光看访客这个名字,猜测这个访客模式应该非常好理解,只要玩过Linux的人,都能深刻明白Root和非Root和访客账号登录的巨大差别性。

What is Visitor?

如果你没玩过Linux,那么假设公共的图书馆有一台电脑,有两个账户:

  • 其中一个是管理员(Admin)的账户,拥有这个电脑的所有权限,但是设置了密码,必须是管理员(她有密码)才能登录;
  • 另一个账户是不需要密码,但是只能玩游戏和看电子书,拥有的权限有限。张三和李四先后使用了这台电脑,那么他们就可以当作是访问者(Visitor)

注意:
访客模式不是就是一种权限控制手段,访问者模式用于在不修改现有对象结构的情况下,定义对对象结构中各元素的新操作

访问者模式的主要目的是将数据结构与对其操作的行为解耦,使得操作可以独立变化而不影响数据结构的稳定性。它通过定义访问者对象,让访问者对象去访问数据结构中的元素,并执行相应的操作。

与访问者模式不同,权限控制是一种安全机制,用于限制对系统资源的访问权限。它确保只有经过授权的用户或角色能够执行特定的操作或访问特定的资源。权限控制通常涉及身份验证、授权策略、访问级别等概念,目的是保护系统的安全性和数据的完整性。

尽管访问者模式和权限控制都涉及到访问和操作的概念,但它们的目的和实现方式是不同的。访问者模式关注于对象结构的操作和扩展,而权限控制关注于系统资源的访问权限和安全性。

他的这个名字非常具有迷惑性,我觉得不应该叫他访问者模式,很容易就让人想到登录电脑那个访问者模式,想到是控制模式那边去,我觉得我得改个名字,就叫他主体不变却可以自由加入行为模式,好吧,确实有点长。

Key Elements

那么我们就可以根据这个例子来设计访问者模式,

  • 首先定义一个抽象的访问者,拥有玩游戏看电子书的方法;
  • 再定义一个抽象节点电脑,接受这个请求的方法;
  • 具体的访问者
  • 具体的节点电脑

假设电脑登录的案例,容易让人关注权限管控操作,让人混淆,所以我用另一个案例——动物的行为案例:

  • 动物接口 void accept(AnimalVisitor visitor);
  • 动物实现类 Dog、Cat、Pig
  • AnimalVisitor 接口
  • AnimalVisitor 实现 (动物们的所有操作,都需要通过AnimalVisitor实现来增加)
  • Client(Zoo)
    feedingVisitor = new FeedingVisitor();
    animal.dog.accept(feedingVisitor);

Example

下面是一个简单的Java示例,用于说明访问者模式的基本概念,假设我们有一个简单的动物园,里面有不同类型的动物(如狗、猫和鸟),我们需要对这些动物进行不同的操作(如喂食、散步等):

首先,我们定义一个动物接口(Animal):

public interface Animal {
    void accept(AnimalVisitor visitor);
}

// 然后,我们定义不同类型的动物类,它们实现了动物接口:
public class Dog implements Animal {
    @Override
    public void accept(AnimalVisitor visitor) {
        visitor.visitDog(this);
    }
}

public class Cat implements Animal {
    @Override
    public void accept(AnimalVisitor visitor) {
        visitor.visitCat(this);
    }
}

public class Bird implements Animal {
    @Override
    public void accept(AnimalVisitor visitor) {
        visitor.visitBird(this);
    }
}

接下来,我们定义一个访问者接口(AnimalVisitor),用于定义不同的操作:

public interface AnimalVisitor {
    void visitDog(Dog dog);
    void visitCat(Cat cat);
    void visitBird(Bird bird);
}

// 然后,我们实现访问者接口,定义具体的操作:
public class FeedingVisitor implements AnimalVisitor {
    @Override
    public void visitDog(Dog dog) {
        System.out.println("Feeding dog: Give it some dog food.");
    }

    @Override
    public void visitCat(Cat cat) {
        System.out.println("Feeding cat: Give it some cat food.");
    }

    @Override
    public void visitBird(Bird bird) {
        System.out.println("Feeding bird: Give it some bird food.");
    }
}

public class WalkingVisitor implements AnimalVisitor {
    @Override
    public void visitDog(Dog dog) {
        System.out.println("Walking dog: Take it for a walk in the park.");
    }

    @Override
    public void visitCat(Cat cat) {
        System.out.println("Walking cat: Let it roam in the backyard.");
    }

    @Override
    public void visitBird(Bird bird) {
        System.out.println("Walking bird: Let it fly around in a safe area.");
    }
}

最后,我们可以创建动物对象,并使用访问者对象执行相应的操作:

public class Zoo {
    public static void main(String[] args) {
        Animal[] animals = { new Dog(), new Cat(), new Bird() };
        
        AnimalVisitor feedingVisitor = new FeedingVisitor();
        AnimalVisitor walkingVisitor = new WalkingVisitor();
        
        for (Animal animal : animals) {
            animal.accept(feedingVisitor);
            animal.accept(walkingVisitor);
        }
    }
}

out:

Feeding dog: Give it some dog food.
Walking dog: Take it for a walk in the park.
Feeding cat: Give it some cat food.
Walking cat: Let it roam in the backyard.
Feeding bird: Give it some bird food.
Walking bird: Let it fly around in a safe area.

这个例子中,动物园中的不同类型的动物实现了相同的接口(Animal),并且接受访问者(AnimalVisitor)进行操作。不同的访问者实现了不同的操作方法,通过调用动物的accept()方法,动物将自身传递给访问者,从而执行相应的操作。

这个例子简化了访问者模式的概念,使得小学生也能理解其中的基本原理和流程。文章来源地址https://www.toymoban.com/news/detail-700210.html

到了这里,关于Visitor Pattern的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 访问者模式(Visitor)

    访问者模式(Visitor)

    访问者模式是一种行为设计模式,可封装一些作用于当前数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 访问者模式包含如下角色: Visitor,访问者基类,声明了一系列以对象结构的具体元素为参数的访问者方法。这些方法的名

    2024年02月13日
    浏览(12)
  • Kotlin~Visitor访问者模式

    Kotlin~Visitor访问者模式

    概念 将数据结构和操作分离,使操作集合可以独立于数据结构变化。 角色介绍 Visitor:抽象访问者,为对象结构每个具体元素类声明一个访问操作。 Element:抽象元素,定义一个accept方法 ConcreteElement:具体元素,实现抽象元素的accept方法,在accept方法中调用访问者的访问方法

    2024年02月13日
    浏览(9)
  • 访客管理系统:Lobby Track Crack

    访客管理系统:Lobby Track Crack

    Lobbytrack桌面 for 微软视窗 一个强大的、功能齐全的现场访客管理系统解决方案。在本地管理您的数据,网络工作站一起配置访客管理流程的各个方面。  扩展您的系统将本地 Web 模块 添加到您的 Lobbytrack 桌面系统,并允许您的员工使用本地 Intranet 上的 Web 浏览器来管理他们

    2024年02月06日
    浏览(8)
  • 文心一言是中文版的ChatGPT?多角度分析猜测文心一言到底是什么?

    文心一言是中文版的ChatGPT?多角度分析猜测文心一言到底是什么?

    ChatGPT爆火网络,一时间风靡不断。 AI替代人类工作的传言四起 宣布ChatGPT类似产品的公司股价大涨,这到底是什么? 国产的类似产品到底到了什么程度? 让我们一起来分析(猜猜)看! 声明:以下数据均来自官方及部分数据收集,以中国普通网民身份角度阐述,不存在捧踩,

    2024年02月02日
    浏览(11)
  • 微信小程序如何完成1000独立访客(UV)

    微信“累计独立访问者(UV)不少于1000人”是指不同IP的累计访问者总数达到1000+,才可以开通流量主功能。 切记,永远不要用机器人刷流量,否则小程序流量的主要功能很可能被永久禁用!!! 1.作为小程序的开发者,首先,你需要开发带有亮点的程序,这些亮点有趣、新

    2024年02月15日
    浏览(12)
  • WordPress 网站使用 CDN 后获取访客真实 IP

    WordPress 往数据库存 IP 的时候似乎用的是 REMOTE_ADDR,这样一来数据库里面的评论信息就全是从各个 CDN 服务器来的 IP。 在 wp-config.php 文件中增加下面代码就可以获取 CDN 后访客的真实 IP。这个函数的核心是用解析后的 HTTP_X_FORWARDED_FOR 替换 REMOTE_ADDR。 

    2024年02月10日
    浏览(15)
  • 帝国cms会员空间增加最近访客列表的实现方法

    1、首先我们去后台新建一个会员字段,用来储存访客记录。 字段名 zuijin 字段标识 最近访客 字段类型 字符型0-255字节(VARCHAR) 255 输入表单替换html代码 \\\" size=\\\"\\\" 2、然后修改会员空间的header.temp.php模板,增加访问空间页面就写入访客记录代码 当用户访问就写入字段zuijin记录下来

    2024年02月03日
    浏览(9)
  • 解决CDN的网站后台无法获取访客真实ip的问题

    解决CDN的网站后台无法获取访客真实ip的问题

    宝塔的面板,网站后台获取到的不是访客的真实 ip ,而是 CDN 的 ip ,这给站长造成了不少影响,例如通过ip地址判定的设置都不准确,甚至假如网站被攻击,对方的真实ip地址都记录不到。 这个问题如何解决? 其实很简单,只需要到 Nginx “设置”中,找到“配置修改”,在

    2024年01月25日
    浏览(43)
  • 微信小程序如何快速累计独立访客(UV)不低于 1000

    微信小程序如何快速累计独立访客(UV)不低于 1000

    小程序要开通流量主功能需要累计1000UV,现在我做了一个互助小程序,可以提交自己的小程序,各位开发者可以相互帮助完成这个指标,快速开通流量主。 1、入口,搜索微信小程序(开发者互助) 2、在个人中心提交自己的小程序 3、别人就可以在首页上帮你点进去累计UV了

    2024年02月14日
    浏览(9)
  • Node-Red-访客、操作员和管理员登录

    Node-Red-访客、操作员和管理员登录

    要实现Node-Red识别图片内容,在这里我们需要下载安装有控件: node-red-dashboard 。 首先在左上角点击设置,并找到节点管理 ; 在节点管理中点击安装; 在安装界面的查询窗口输入node-red-dashboard控件,查询后选择下载,等待下载完成; 本案例主要实现的功能包含有模式选择及

    2023年04月08日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包