【设计模式】访问者模式

目录

什么是访问者模式

访问者模式的组成:

使用场景:

示例代码:


什么是访问者模式

Java 中的访问者模式(Visitor Pattern)是一种行为型设计模式,允许你在不修改已有类的结构的情况下,增加这些类的新功能。这是通过创建一个外部的访问者类来实现的,它可以处理不同类型的对象。

访问者模式的组成:

  1. 访问者接口(Visitor):定义了对每种元素类(Element)的访问操作。每个操作的名称和参数标识了被访问的元素类。
  2. 具体访问者(Concrete Visitor):实现访问者接口,定义了对每一个元素类的具体访问操作。
  3. 元素接口(Element):定义了一个接受访问者的方法(accept(Visitor))。
  4. 具体元素(Concrete Element):实现元素接口,其accept()方法通常如下所示:visitor.visit(this);
  5. 对象结构(Object Structure):一个元素的集合,可以遍历这些元素,让访问者访问它们。

使用场景:

  • 当一个对象结构包含很多类对象,且你想对这些对象执行一些依赖于其具体类的操作时。
  • 需要对一个复杂的对象结构执行多种不同且不相关的操作,而且你想避免让这些操作"污染"这些对象的类时。
  • 多个不同的外部类需要对某些类进行操作,但你不想修改类的情况下添加新操作。

示例代码:

这里,我们将创建一个表示计算机部件的类结构,并通过访问者来显示部件的信息和更新部件状态。

// 访问者接口
interface ComputerPartVisitor {
    void visit(Computer computer);
    void visit(Mouse mouse);
    void visit(Keyboard keyboard);
    void visit(Monitor monitor);
}

// 元素接口
interface ComputerPart {
    void accept(ComputerPartVisitor computerPartVisitor);
}

// 具体元素类
class Keyboard implements ComputerPart {
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}

class Monitor implements ComputerPart {
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}

class Mouse implements ComputerPart {
    public void accept(ComputerPartVisitor computerPartVisitor) {
        computerPartVisitor.visit(this);
    }
}

class Computer implements ComputerPart {
    ComputerPart[] parts;

    public Computer(){
        parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};
    }

    public void accept(ComputerPartVisitor computerPartVisitor) {
        for (int i = 0; i < parts.length; i++) {
            parts[i].accept(computerPartVisitor);
        }
        computerPartVisitor.visit(this);
    }
}

// 具体访问者
class ComputerPartDisplayVisitor implements ComputerPartVisitor {
    public void visit(Computer computer) {
        System.out.println("Displaying Computer.");
    }

    public void visit(Mouse mouse) {
        System.out.println("Displaying Mouse.");
    }

    public void visit(Keyboard keyboard) {
        System.out.println("Displaying Keyboard.");
    }

    public void visit(Monitor monitor) {
        System.out.println("Displaying Monitor.");
    }
}

// 示例
public class Main {
    public static void main(String[] args) {
        ComputerPart computer = new Computer();
        computer.accept(new ComputerPartDisplayVisitor());
    }
}

        在这个例子中,ComputerPart 是元素接口,Computer, Mouse, Keyboard, Monitor 是具体元素。ComputerPartVisitor 是访问者接口,ComputerPartDisplayVisitor 是具体访问者,定义了对每种类型的计算机部件的操作。

这样的设计使得新增其他操作(如维修、升级等)变得简单,只需添加新的访问者类而不用修改现有的元素类。

        非常的实用,喜欢的小伙伴可以动动你们发财的小手,给博主一个小小的点赞或者关注,就是对博主最大的鼓励,爱你们哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值