gpt4 book ai didi

java - java 中的访问者模式实现 - 这看起来怎么样?

转载 作者:行者123 更新时间:2023-12-02 09:36:45 24 4
gpt4 key购买 nike

Alrite,我要直接跳到代码:

public interface Visitor {

public void visitInventory();
public void visitMaxCount();
public void visitCountry();
public void visitSomethingElse();
public void complete();
//the idea of this visitor is that when a validator would visit it, it would validate data
//when a persister visits it, it would persist data, etc, etc.
// not sure if I making sense here...
}

public interface Visitable {
public void accept(Visitor visitor);
}

这是一个基本实现:

public class StoreValidator implements Visitor {
private List <ValidationError> storeValidationErrors = new ArrayList<ValidationError>();

public void addError(ValidationError error) {
storeValidationErrors.add(error);
}

public List<ValidationError> getErrors() {
return storeValidationErrors;
}

public void visitInventory() {
// do nothing
}

public void visitMaxCount() {
//do nothing
}
//... etc.. all empty implementations

}

你会明白为什么我在这里做了一个空的实现...我现在会编写一个 validator ..它扩展了 StoreValidator

public XYZValidator extends StoreValidator {

@Override
public void visitInventory(Visitable visitable) {
// do something with visitable .. cast it to expected type
// invoke a DAO, obtain results from DB
// if errors found, do addError(new ValidationError()); with msg.
}

@Override
public void visitMaxCount(Visitable visitable) {
//do something with visitable..
}

// I wouldn't implement the rest coz they wouldn't make sense
// in XYZValidator.. so they are defined as empty in StoreValidator.

}

现在可访问的内容如下:

public Store implements Visitable {

public void accept(Visitor visitor) {
visitor.visitInventory();
visitor.visitMaxCount();
}
}

我可以使用在 Store 对象列表上执行类似操作的代码:

List<Store> stores; //assume this has a list of stores.
StoreValidator validator = new XYZValidator(); //or I would get it from a validatorfactory
for(Store store: stores) {
store.accept(validator); // so even if you send a wrong validator, you are good.
}

类似地,您将拥有 ABCValidator,它将提供其他方法(visitCountry/VisitSomethinElse)的实现,并且它将从 StoreValidator 扩展。我会有另一种类型的对象(不是存储)定义接受方法。

我确实发现这里有问题......比如说,我需要一个与 StoreValidator 不同的 FileValidator,我希望它没有这些与业务相关的验证,例如 VisitInventory() 等。但是,通过使用单个接口(interface) Visitor,我最终会在访客界面。那是对的吗?你就是这样做的吗?

我不知道我的模式是否错误,或者我是否有任何意义。请分享您的想法。

最佳答案

前段时间我为我的硕士论文写了类似的东西。这段代码稍微类型比你的安全:

interface Visitable<T extends Visitor> {

void acceptVisitor(T visitor);
}

interface Visitor {

/**
* Called before any other visiting method.
*/
void startVisit();

/**
* Called at the end of the visit.
*/
void endVisit();
}

示例:

interface ConstantPoolVisitor extends Visitor {

void visitUTF8(int index, String utf8);

void visitClass(int index, int utf8Index);

// ==cut==
}

class ConstantPool implements Visitable<ConstantPoolVisitor> {

@Override
public void acceptVisitor(ConstantPoolVisitor visitor) {
visitor.startVisit();

for (ConstanPoolEntry entry : entries) {
entry.acceptVisitor(visitor);
}

visitor.endVisit();
}

所以,是的,我认为当且仅当您的数据变化比您的行为慢时,这绝对是一个良好且灵活的设计。在我的示例中,数据是固定的 Java 字节码(由 JVM 规范定义)。当“行为占主导地位”(我想转储、编译、转换、重构等我的字节码)时,访问者模式允许您更改/添加/删除行为,而无需触及数据类。只需添加另一个 Visitor 实现即可。

为了简单起见,假设我必须向我的访问者界面添加另一个访问方法:我最终会破坏我的所有代码。

作为替代方案,我会考虑此场景的策略模式。策略+装饰器是一个很好的验证设计。

关于java - java 中的访问者模式实现 - 这看起来怎么样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/944824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com