首页 > 其他分享 >设计模式行为模式-访问者模式

设计模式行为模式-访问者模式

时间:2023-09-03 22:02:33浏览次数:38  
标签:对象 Visitor 元素 模式 Element 设计模式 访问者



文章目录

  • 介绍
  • 基本原理
  • 1. 定义访问者模式
  • 2. 角色及其职责
  • 2.1 元素(Element)
  • 2.2 具体元素(ConcreteElement)
  • 2.3 访问者(Visitor)
  • 2.4 具体访问者(ConcreteVisitor)
  • 2.5 对象结构(Object Structure)
  • 3. 访问者模式的工作流程
  • 适用场景
  • 1. 对象结构稳定,但需要经常增加新的操作
  • 2. 处理复杂的对象结构,并对不同元素进行不同操作
  • 3. 需要在不改变元素类的情况下添加新的操作
  • 优缺点
  • 1. 优点
  • 适用案例
  • 访问者模式可以用于AOP(面向切面编程)
  • 总结


介绍

  • 概述访问者模式:访问者模式是一种行为型设计模式,它将数据结构与对数据的操作分离,从而实现操作的独立性和扩展性。
  • 访问者模式的作用和优势:访问者模式可以处理复杂的对象结构,使得新增操作简单且不影响已有元素类。

基本原理

1. 定义访问者模式

访问者模式定义了一组角色及其相应职责,包括元素、具体元素、访问者、具体访问者和对象结构。

设计模式行为模式-访问者模式_java

2. 角色及其职责

2.1 元素(Element)

元素是访问者模式中的一个角色,它定义了一个接受访问者对象并调用访问者对象对自身进行操作的方法。元素可以是一个类或接口,其中包含accept(visitor)方法。

2.2 具体元素(ConcreteElement)

具体元素是元素的实现类,它实现了元素接口,并提供了具体的操作方法。每个具体元素都会实现accept(visitor)方法,将自身传递给访问者对象。

2.3 访问者(Visitor)

访问者是访问者模式中的另一个角色,它定义了对具体元素的操作方法。访问者可以是一个接口或抽象类,其中定义了一系列以具体元素作为参数的操作方法。

2.4 具体访问者(ConcreteVisitor)

具体访问者是访问者的实现类,它实现了访问者接口,并针对每个具体元素提供了相应的操作方法。每个具体访问者都能够处理特定类型的具体元素。

2.5 对象结构(Object Structure)

对象结构是访问者模式的一个重要组成部分,它存储了要被访问的对象集合,并提供了遍历元素的方法。对象结构可以是一个类或接口,通常使用容器(如列表或树)来管理元素和访问者的关系。

在访问者模式中,具体元素通过accept(visitor)方法将自身传递给访问者对象,让访问者对象根据具体元素的类型调用相应的操作方法。这种方式实现了元素与操作的解耦,使得新增操作变得简单而无需修改已有元素类。同时,访问者模式还提供了一种统一的访问方式,方便对复杂对象结构进行操作和扩展。

3. 访问者模式的工作流程

访问者模式的工作流程如下:

  1. 定义一个对象结构(Object Structure),用于存储要被访问的对象集合。这个对象结构可以是一个类或接口。
  2. 在对象结构中提供一个遍历元素的方法,通常是通过迭代器或递归来实现。
  3. 定义一个元素接口(Element),其中包含一个accept(visitor)方法。
  4. 实现具体元素(Concrete Element)类,实现元素接口,并在accept(visitor)方法中将自身传递给访问者对象。
  5. 定义一个访问者接口(Visitor),其中声明了对每个具体元素进行操作的多个方法。
  6. 实现具体访问者(Concrete Visitor)类,实现访问者接口,并实现对具体元素的操作方法。
  7. 在客户端代码中,创建对象结构和具体元素的实例,并调用对象结构的遍历方法。
  8. 在遍历过程中,每个元素通过accept(visitor)方法将自身传递给具体访问者对象,让访问者对象根据元素的类型调用相应的操作方法。

通过以上流程,访问者模式实现了对对象结构中元素的遍历和操作的分离,使得新增操作变得简单且不影响已有元素类。同时,访问者模式还提供了一种统一的访问方式,便于操作和扩展复杂对象结构。

适用场景

1. 对象结构稳定,但需要经常增加新的操作

当对象结构稳定,但经常需要对其进行新的操作时,使用访问者模式可以方便地添加新的操作,无需修改已有元素类。

2. 处理复杂的对象结构,并对不同元素进行不同操作

访问者模式适用于处理复杂的对象结构,其中不同类型的元素需要进行不同的操作。

3. 需要在不改变元素类的情况下添加新的操作

通过新增具体访问者类来添加新的操作,而无需修改元素类,从而实现对对象结构的扩展。

优缺点

1. 优点

  • 分离数据结构与操作,提高灵活性和可扩展性。
  • 新增操作简单,无需修改元素类。
  • 提供一种统一的访问方式,便于操作和扩展复杂对象结构。

##2. 缺点

  • 增加新的元素类较困难,需要修改访问者接口和所有具体访问者类。
  • 增加新的访问者类较困难,需要修改元素类的接口。

适用案例

访问者模式可以用于AOP(面向切面编程)

以下是一个使用访问者模式实现AOP的示例:

首先,我们定义切面逻辑(Visitor)和被切对象(Element):

// 切面逻辑 Visitor 接口
public interface Visitor {
    void visit(Element element);
}

// 被切对象 Element 接口
public interface Element {
    void accept(Visitor visitor);
}

然后,我们实现具体的切面逻辑和被切对象:

// 具体切面逻辑 Visitor 实现类
public class LoggingVisitor implements Visitor {
    @Override
    public void visit(Element element) {
        // 在这里实现切面逻辑
        System.out.println("Logging: 切入点" + element.toString());
    }
}

// 具体被切对象 Element 实现类
public class ConcreteElement implements Element {
    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }

    // 被切对象的具体方法
    public void operation() {
        System.out.println("正常执行逻辑");
    }
}

最后,我们在客户端代码中使用访问者模式:

public class Client {
    public static void main(String[] args) {
        // 创建切面逻辑 Visitor 对象
        Visitor visitor = new LoggingVisitor();

        // 创建被切对象 Element 对象
        Element element = new ConcreteElement();

        // 被切对象接受切面逻辑
        element.accept(visitor);

        // 调用被切对象的方法
        ((ConcreteElement) element).operation();
    }
}

通过上述示例代码,我们实现了一个简单的AOP示例,使用访问者模式将切面逻辑和被切对象解耦,并在被切对象的特定点上执行切面逻辑。注意,在实际使用中,AOP通常需要结合其他框架或库,例如Spring AOP,在更复杂的场景下进行配置和管理。此处的示例只是用于演示访问者模式在AOP中的应用。

设计模式行为模式-访问者模式_访问者_02

总结

结合AOP(面向切面编程)的业务,访问者模式可以用来实现动态的AOP切入。

AOP主要关注在程序运行期间对横切关注点(如日志记录、性能监测、事务管理等)的处理。使用访问者模式可以将这些横切关注点抽象为访问者对象,被切入的对象则作为元素对象。通过访问者模式,可以实现以下效果:

  1. 分离核心业务逻辑与横切关注点:将核心业务逻辑封装在元素对象中,而将横切关注点封装在访问者对象中。
  2. 动态添加新的关注点:当需要新增一种横切关注点时,只需要创建一个新的访问者对象并实现相应的逻辑,而不需要修改已有的元素对象。
  3. 实现可插拔的切面逻辑:通过切换不同的访问者对象,可以在运行时决定执行哪些横切关注点,从而实现动态的AOP切入。
  4. 提高代码的可维护性和灵活性:将不同横切关注点的处理逻辑封装在访问者对象中,使得代码结构更加清晰,并且可以灵活地组合和拆分横切关注点。
  5. 遵循开闭原则与单一职责原则:通过添加新的访问者对象,可以在不修改已有代码的情况下扩展业务逻辑,并且每个访问者对象只负责执行特定的关注点逻辑,符合单一职责原则。


标签:对象,Visitor,元素,模式,Element,设计模式,访问者
From: https://blog.51cto.com/u_15918766/7343555

相关文章

  • 外观模式:简化复杂子系统的访问与使用
    文章目录1.简介2.外观模式的基本结构3.外观模式的实现步骤4.外观模式的应用与实例4.1图形界面库的外观模式应用4.2文件压缩与解压缩的外观模式应用4.3订单处理系统的外观模式应用5.外观模式的优缺点5.1优点5.2缺点6.总结1.简介外观模式是一种结构型设计模式,它提供了......
  • 设计模式-原型模式详解
    文章目录前言理论基础1.原型模式定义2.原型模式角色3.原型模式工作过程4.原型模式的优缺点实战应用1.原型模式适用场景2.原型模式实现步骤3.原型模式与单例模式的区别原型模式的变体1.带有原型管理器的原型模式2.懒汉式单例模式的原型模式实现3.细粒度原型模式总结前言......
  • 设计模式-装饰模式
    文章目录一、简介二、基本概念三、装饰模式的结构和实现类图解析:装饰器的实现方式继承实现:组合实现:继承和组合对比四、装饰模式的应用场景五、与其他模式的关系六、总结一、简介装饰模式是一种结构型设计模式,它允许动态地向对象添加额外的功能。二、基本概念装饰模式定义:在不改变......
  • 设计模式-迭代器
    文章目录1.引言1.1概述1.2设计模式1.3迭代器模式的应用场景1.4迭代器模式的作用2.基本概念2.1迭代器Iterator2.2聚合Aggregate2.3具体聚合ConcreteAggregate3.Java实现迭代器模式3.1Java集合框架3.2Java迭代器接口3.3Java迭代器模式实现示例4.迭代器模式的优......
  • Go 设计模式中策略模式
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)  在Go设计模式中,策略模式是一种行为型模式,用于在运行时选择算法的行为。策略模式将不同的算法封装成各自的策略对象,并使得这些策略对象......
  • Go 设计模式中访问者模式
    鱼弦:全栈领域创作新星创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)在Go设计模式中,访问者模式(VisitorPattern)是一种行为型模式,用于将算法与数据结构分离,使得算法可以独立地操作数据结构的不同元素,同时遵循......
  • c++单例模式总结
    分类懒汉式:实例对象在第一次被使用时才进行初始化。饿汉式:实例在定义时就被初始化。特点1、构造函数和析构函数私有化,不允许外部创建实例对象。2、拷贝构造函数和复制运算符重载被delete,不允许产生新的实例。3、内部定义一个私有的静态数据成员,该成员为本类的实例化对象。4......
  • 基于状态模式: 没有实践,再多的理论都是扯淡!!!
    基于状态模式:没有实践的理论都是扯淡!!!定义状态模式是一种面向对象的设计模式,它允许一个对象在其内部状态改变时改变它对应的行为。状态模式的关键在于如何区分事物内部的状态,事物内部状态的改变往往会带来事物的行为的改变。通常我们谈到封装,一般都会优先封装对象的行为(比如,某个函......
  • 设计模式:通俗易懂版
    ......
  • 两个例子理解js设计模式中的【适配器模式】
    适配器模式的精髓:如果现有的接口已经能够正常工作,那我们就永远不会用上适配器模式。适配器模式是一种“亡羊补牢”的模式,没有人会在程序的设计之初就使用它。因为没有人可以完全预料到未来的事情,也许现在好好工作的接口,未来的某天却不再适用于新系统,那么我们可以用适配器模式把旧......