关于电商网站规划方案,ps做网站logo设置多少,国内的电商平台有哪些,yy直播助手1)意图 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义用于这些元素的新操作。 2)结构
访问者模式的结构图如图 7-48 所示。 其中: Visitor(访问者) 为该对象结构中ConcreteElement 的每一个类声明一个 Vsit 操作。该操作的名字和特征标识…1)意图 表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义用于这些元素的新操作。 2)结构
访问者模式的结构图如图 7-48 所示。 其中: Visitor(访问者) 为该对象结构中ConcreteElement 的每一个类声明一个 Vsit 操作。该操作的名字和特征标识了发送 Visit 请求给该访问者的那个类这使得访问者可以确定正被访问元素的具体的类。这样访问者就可以通过该元素的特定接口直接访问它。 ConcreteVisitor(具体访问者) 实现每个有 isitor 声明的操作每个操作实现本算法的一部分而该算法片段乃是对应于结构中对象的类。ConcreteVsitor 为该算法提供了上下文并存储它的局部状态。这一状态常常在遍历该结构的过程中累积结果。 Element(元素) 定义以一个访问者为参数的Accept 操作。 ConcreteElement(具体元素) 实现以一个访问者为参数的Accept 操作。 ObiectStucture(对象结构) 能枚举它的元素:可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个组合或者一个集合如一个列表或一个无序集合。
3)适用性
Visitor 模式适用于: 一个对象结构包含很多类对象它们有不同的接口而用户想对这些对象实施一些依赖于其具体类的操作。 需要对一个对象结构中的对象进行很多不同的并且不相关的操作而又想要避免这些操作“污染”这些对象的类。Visitor 使得用户可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时用 Visitor 模式让每个应用仅包含需要用到的操作。 定义对象结构的类很少改变但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口这可能需要很大的代价。如果对象结构类经常改变那么可能还是在这些类中定义这些操作较好。
4 应用举例
代码审查系统
假设我们有一个代码审查系统需要检查代码中的变量和函数。我们可以使用访问者模式来实现其中变量和函数是具体元素而检查规则是访问者。
Java代码示例
// 元素接口
interface CodeElement {void accept(CodeVisitor visitor);
}// 具体元素变量
class Variable implements CodeElement {private String name;public Variable(String name) {this.name name;}Overridepublic void accept(CodeVisitor visitor) {visitor.visit(this);}public String getName() {return name;}
}// 具体元素函数
class Function implements CodeElement {private String name;public Function(String name) {this.name name;}Overridepublic void accept(CodeVisitor visitor) {visitor.visit(this);}public String getName() {return name;}
}// 访问者接口
interface CodeVisitor {void visit(Variable element);void visit(Function element);
}// 具体访问者检查规则
class CodeChecker implements CodeVisitor {Overridepublic void visit(Variable element) {System.out.println(检查变量 element.getName() 是否已定义。);}Overridepublic void visit(Function element) {System.out.println(检查函数 element.getName() 是否有返回值。);}
}// 对象结构代码文件
class CodeFile {private ListCodeElement elements new ArrayList();public void addElement(CodeElement element) {elements.add(element);}public void accept(CodeVisitor visitor) {for (CodeElement element : elements) {element.accept(visitor);}}
}public class VisitorPatternDemo {public static void main(String[] args) {CodeFile codeFile new CodeFile();codeFile.addElement(new Variable(x));codeFile.addElement(new Function(getLength));CodeVisitor checker new CodeChecker();codeFile.accept(checker);}
}在这个例子中
CodeElement 是元素接口定义了 accept() 方法。Variable 和 Function 是具体元素它们实现了 accept() 方法用于调用访问者的 visit() 方法。CodeVisitor 是访问者接口定义了访问具体元素的方法。CodeChecker 是具体访问者实现了访问者接口中的方法用于检查具体元素。CodeFile 是对象结构用于存储和遍历元素以及调用访问者。
通过访问者模式我们可以在不修改现有元素类的情况下增加新的行为这提高了代码的灵活性和扩展性。