在写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);
}
接下来,我们需要创建一个实现了"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
这本书的作者团队,被人称为四人组。这本书包含最基本的设计模式,是揭开设计模式序幕的作品。
但是写代码就像盖房子,而模式
真正的起源也是一个建筑师(建筑模式,而非计算机设计模式),而非四人组。