首页 > 其他分享 >Visitor Pattern

Visitor Pattern

时间:2023-09-08 15:56:01浏览次数:36  
标签:Visitor void dog bird AnimalVisitor Pattern public 访问者

光看访客这个名字,猜测这个访客模式应该非常好理解,只要玩过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()方法,动物将自身传递给访问者,从而执行相应的操作。

这个例子简化了访问者模式的概念,使得小学生也能理解其中的基本原理和流程。

标签:Visitor,void,dog,bird,AnimalVisitor,Pattern,public,访问者
From: https://www.cnblogs.com/mysticbinary/p/17687786.html

相关文章

  • Interpreter Pattern
    Itcanexplainwhat?如下是解释器要解释的主体:加减乘除等运算,3+4/9+6*8摩尔斯电码正则表达式El表达式OGNL表达式小明是北京人小红是一名售货员部门领导下发一则通知...Howexplain?解释器模式常用于对简单语言集的编译或分析,例如:我是大学生张强学习编程小明......
  • Mediator Pattern
    MediatorPattern就类似现实生活中的中介(中间人),房屋中介、媒婆中介、权利寻租中介...,现实中为什么需要中介,在现实中的原因主要是两个一为了保护双方当事人的安全,只要中介人不泄密,他们双方就可以秘密的把交易完成,并且双方都是安全的。二是买卖双方并不信任双方,但是他们都共同的......
  • Bridge Pattern
    WhatisBridgePattern桥接模式(BridgePattern),旨在将抽象部分和实现部分解耦,使它们可以独立地变化。该模式通过将抽象和实现分离,使它们可以独立地进行扩展和修改,同时通过桥接(Bridge)将它们连接起来。将一个事物原本耦合在一起的东西,通过定义成抽象和实现两个维度,做到解耦,解耦就......
  • Template Pattern —— Behavioral Class
    HookMethod钩子方法(HookMethod)之所以被称为“钩子”,是因为它在算法或流程中提供了一个“钩子”,允许子类在特定的点上“钩入”自己的实现逻辑,从而影响算法的行为或流程的执行。它类似于一个挂钩、锚点,所以叫Hookmethod,它允许子类插入自定义的代码来改变或扩展算法的功能。T......
  • Flyweight Pattern —— Creational Class
    享元模式在主流的标准里是放到结构大类下的,但是我感觉这个模式的最终作用也是为了获取一个类,所以我将其划分到创建大类下。WhatisFlyweightPatternFlyweight是指轻量级的。享元模式旨在支持大量细粒度的对象共享,以减少内存消耗。该模式通过共享相似对象的部分状态,来减少对......
  • Factory Pattern —— Creational Class
    core工厂模式(FactoryPattern)是一种创建型设计模式,用于创建对象而不暴露对象创建的逻辑。它将对象的实例化过程封装在一个工厂类中,客户端通过调用工厂类的方法来创建对象,从而实现了解耦和灵活性。工厂模式的核心思想是将对象的创建与使用分离。客户端不直接实例化对象,而是通过调......
  • 20230626 java.util.regex.Pattern
    介绍java.util.regex.PatternpublicfinalclassPatternimplementsjava.io.Serializable正则表达式的编译表示API常量flagUNIX_LINES启用UNIX行模式在多行模式中匹配^和$时,只有\n被识别成行终止符CASE_INSENSITIVE不区分大小写匹配字符时忽略字母的......
  • Visitor Pattern-访问者模式
    C#中的访问者模式(VisitorPattern)是一种行为型设计模式,它将数据结构和数据操作分离,使得可以在不修改数据结构的前提下定义新的操作。访问者模式的核心思想是将数据结构和数据操作解耦,将数据操作封装到独立的访问者类中。数据结构定义一组元素,每个元素接受访问者的访问并调用相应......
  • Strategy Pattern-策略模式
    C#中的策略模式(StrategyPattern)是一种行为型设计模式,它可以让你定义一族算法,并将每个算法封装起来,使它们可以相互替换,从而使得算法的变化独立于使用算法的客户端。策略模式的核心思想是将算法的定义和使用分离,将不同的算法封装到独立的策略类中。这样,客户端可以根据需求从不同的......
  • StatePattern-状态模式
    C#中的状态模式是一种行为型设计模式,它允许对象在其内部状态发生改变时改变其行为。状态模式的核心思想是将对象的行为封装在不同的状态类中,对象根据当前状态的不同而执行不同的行为。在C#中,实现状态模式通常需要以下几个参与者:状态接口(StateInterface):定义了表示不同状态的方法......