访问者模式:访客与房间的友好互动

背景

在写compiler的时候,需要进行type checking.需要检查的类很像,但是每个类又需要特殊定制。我总不能在打开已经写好的类,去修改吧。于是我就用到了Visitor pattern

什么是访问者模式

from Gang of Four: Represent[ing] an operation to be performed on elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.

当你需要对一个对象的不同部分进行操作时,可能需要使用访问者模式。访问者模式是一种行为型设计模式,它可以将算法与其作用的对象分离开来,从而使算法在不修改对象结构的情况下可用。

访问者模式通常涉及两个类:访问者和被访问者。被访问者是包含一些元素的类,而访问者是执行特定操作的类。访问者需要了解被访问者的接口,以便可以访问它的元素。

通过访问者模式,我们可以对元素的操作进行扩展,而无需对元素进行更改。访问者可以访问所有的元素,并执行特定的操作。这使得在需要添加新操作时更加容易,而无需更改现有代码。

实例

假设我们有一个图书馆,里面有书和杂志。我们需要能够根据不同的需要进行搜索,比如查找所有的杂志,或者查找所有的英语书籍。

创建接口

首先,我们需要创建一个接口,它定义了被访问者的方法。在这个例子中,我们创建了一个叫做"LibraryItem"的接口,它有一个叫做"accept"的方法。

public interface LibraryItem {
    public void accept(LibraryVisitor visitor);
}

然后,我们需要创建一个访问者接口,它定义了在被访问者上执行的操作。在这个例子中,我们创建了一个叫做"LibraryVisitor"的接口,它有一些不同的方法,比如"visit(Book book)“和"visit(Magazine magazine)”。

public interface LibraryVisitor {
    public void visit(Book book);
    public void visit(Magazine magazine);
}

实现 Library Item

接下来,我们需要创建一个实现了"LibraryItem"接口的类。在这个例子中,我们创建了一个叫做"Book"的类,它实现了"accept"方法。(当然这个类还有其它属性和方法)。

public class Book implements LibraryItem {
    public void accept(LibraryVisitor visitor) {
        visitor.visit(this);
    }
}
public class Magazine implements LibraryItem {
    public void accept(LibraryVisitor visitor) {
        visitor.visit(this);
    }
}

定制我们的功能

最后,我们需要创建一个实现了"LibraryVisitor"接口的类。在这个例子中,我们创建了一个叫做"SearchVisitor"的类,它实现了"visit(Book book)"和"visit(Magazine magazine)"方法。

public class SearchVisitor implements LibraryVisitor {
    public void visit(Book book) {
        // 搜索图书馆中的书籍
    }
    public void visit(Magazine magazine) {
        // 搜索图书馆中的杂志
    }
}

现在,我们可以使用访问者模式来执行搜索操作。首先,我们需要创建一个"SearchVisitor"对象。

LibraryVisitor visitor = new SearchVisitor();

然后,我们可以遍历图书馆中的所有元素,并使用"accept"方法来接受访问者。

List<LibraryItem> libraryItems = new ArrayList<>();
libraryItems.add(new Book());
libraryItems.add(new Magazine());

for (LibraryItem item : libraryItems) {
    item.accept(visitor);
}

这样,访问者就可以访问每一个元素,并执行特定的操作。如果我们需要添加新的搜索操作,只需创建一个新的访问者类并实现相应的方法即可,而无需更改现有的代码。

访问者模式是一种非常有用的设计模式,它可以帮助我们更好地组织代码并实现可扩展性。它的主要优点是可以将算法与其作用的对象分离开来,从而使代码更加模块化和可维护。同时,它也允许我们在不修改现有代码的情况下添加新的操作。

总结

总结就是好好学习设计模式,有时候真的会给你节省时间,而且会训练我们的思维,代码也会更加优雅。

备注

Gang of Four: 是Design patterns这本书的作者团队,被人称为四人组。这本书包含最基本的设计模式,是揭开设计模式序幕的作品。
但是写代码就像盖房子,而模式真正的起源也是一个建筑师(建筑模式,而非计算机设计模式),而非四人组。

你可能感兴趣的:(访问者模式,java,开发语言,设计模式)